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

如果有可用的列表与 tagfiltered-list, , 我想 list_titles 开火。但是,如果没有匹配 tag, ,我想将其弹回URL处理器,所以 show_title 开火。

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

我知道我可以从视图内部做到这一点...但是必须将过程刻密地连接到视图中。我希望URL命令首先确定选择的内容,以及它交出的内容。

有帮助吗?

解决方案

这肯定是逻辑。所有urls.py url is is is用于匹配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