我有这样的网址格式:
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命令来决定首先选择哪些内容以及将其交给哪些内容。
答案 0 :(得分:38)
这当然是视角逻辑;所有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),
}