سؤال

لدي نمط عناوين URL مثل هذا:

urlpatterns = (
    url(r'^$', list_titles, name='list'),
    url(r'^(?P<tag>[a-z\-0-9]+?)/$', list_titles, name='filtered-list'),
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
)

ال filtered-list و title تطابق نفس الأشياء.

إذا كانت هناك قائمة متاحة بالأشياء التي تطابق tag في filtered-list, ، أريد list_titles لإطلاق النار. ولكن إذا لم يكن هناك مطابقة tag, أريد أن أعود الفقاعة إلى معالج URL show_title حرائق قبالة.

إذا لم يكن هناك عنوان مطابق، سأرفع 404 مناسبة هناك.

أعلم أنني أستطيع القيام بذلك من داخل المنظر ... ولكن رائحة كريهة بعض الشيء تتضارم إلى الأسلاك الصعبة العملية في الرأي. أرغب في طلب عنوان URL أن يقرر ما الذي يتم اختياره أولا وما يدخله.

هل كانت مفيدة؟

المحلول

هذا هو بالتأكيد عرض المنطق؛ كل urls.py هو مخصص لأنماط URL مطابقة، وليس أداء التحقق من الصحة. يمكنك استعمال ال Http404 استثناء للتعامل مع هذا.

from django.http import Http404

def detail(request, poll_id):
    try:
        p = Poll.objects.get(pk=poll_id)
    except Poll.DoesNotExist:
        raise Http404
    return render_to_response('polls/detail.html', {'poll': p})

بدلا من ذلك، قد تجد get_object_or_404 أو get_list_or_404 الأساليب، التي تقصيرها قليلا.


تحرير الموعود يتبع. ليس بالضبط ما تبحث عنه، ولكن ...

urlpatterns = (
    url(r'^$', list_titles, name='list'),
)

if 1=1: # Your logic here
    urlpatterns += ( url(r'^$', list_titles, name='list'), )

urlpatterns += (
    url(r'^(?P<title>\S+?)/$', show_title, name='title'),
    url(r'^spam/$', spam_bar),
    url(r'^foo/$', foo_bar),
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top