提起404,并继续URL链(Raise 404 and continue the URL chain

2019-08-01 17:28发布

我有一个像这样的网址模式:

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-listtitle匹配同样的事情。

如果有事情匹配的可用列表tagfiltered-list ,我想list_titles火熄灭。 但是,如果没有匹配的tag ,我想泡沫,这回URL处理器使show_title打完。

如果没有匹配的标题,我会提出一个正确的404那里。

我知道我可以从视图中做到这一点...但它是一个有点臭不必硬线过程到视图中。 我想的URL以决定什么被挑选出的第一,它把手拿开到什么。

Answer 1:

这当然查看的逻辑; 所有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_404get_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),
}


文章来源: Raise 404 and continue the URL chain