提高404并继续URL链

Oli*_*Oli 29 django django-signals django-urls django-views

我有一个像这样的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'),
)
Run Code Online (Sandbox Code Playgroud)

filtered-listtitle匹配同样的事情.

如果有事情匹配的可用列表tagfiltered-list,我要list_titles火了.但是,如果没有匹配tag,我想将其重新发送回URL处理器,以便show_title激活.

如果没有匹配的标题,我会在那里提出一个合适的404.

我知道我可以从视图中做到这一点......但是有点臭,不得不将进程硬连接到视图中.我希望通过URL命令来决定首先选择哪些内容以及它的内容.

小智 41

这当然是视角逻辑; 所有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})
Run Code Online (Sandbox Code Playgroud)

或者,您可以找到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),
}
Run Code Online (Sandbox Code Playgroud)

  • `raise Http404`应该是`raise Http404()`:https://docs.djangoproject.com/en/2.0/topics/http/views/#the-http404-exception (3认同)
  • 感谢 get_list_or_404 但这并不是我问题的答案。我是说,如果我无法根据 URL 获取标题列表,我希望通过其余 URL 重新评估该 URL。 (2认同)
  • 这不是一个有效的答案。引发 Http404 后 URL 查找不继续 (2认同)