Подтвердить что ты не робот

Поднимите 404 и продолжите цепочку URL-адресов

У меня есть шаблон 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-адрес определил, что выбирается первым и что он передает.

Изменить: Я идиот.

Это именно то, что происходит по умолчанию! Пока вы правильно соответствуете. У моего метода show_title отсутствовал его аргумент title, поэтому третий URL-адрес не передавался должным образом.

Хорошо, так немного измененный вопрос: зная теперь, что в него встроена обработка исключений, было бы более эффективным для меня передать запрос вручную show_title (из list_titles, или это будет, на балансе, лучше оставить URL-адреса, обрабатывающие вещи?

Edit2: Месть идиот

Оказывается, это не делает этого вообще. Я случайно изменил первый шаблон, чтобы он не совпадал, и подумал, что он отдает подробный вид. Боюсь, что один из тех дней.

4b9b3361

Ответ 1

Это, безусловно, логика просмотра; all 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),
}