جمع 404 واستمر سلسلة URL
-
18-09-2019 - |
سؤال
لدي نمط عناوين 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),
}