Поднять 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),
}