Вопрос

У меня есть образец 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