39

我有一个这样的 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-listtitle匹配相同的东西。

如果有与 in 匹配的可用列表tagfiltered-list我想list_titles启动。但是,如果没有匹配的tag,我想将其返回到 URL 处理器,以便show_title触发。

如果没有匹配的标题,我会在那里提出适当的 404。

我知道我可以从视图内部执行此操作......但是将过程硬连接到视图中有点臭。我希望 URL 顺序来决定首先选择什么以及它交给什么。

4

1 回答 1

56

这当然是视图逻辑;所有 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_404orget_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),
}
于 2009-08-19T12:53:11.217 回答