繁体   English   中英

Django:命名为Url /相同的正则表达式,不同的名称

[英]Django: Named Url's/ Same regex, different Names

我有一个urls.py文件,其中包含多个具有相同命名参数和正则表达式但名称不同的URL。 当我使用{%url'name'param%}从模板调用视图函数时,它会忽略该名称而调用urls.py文件中的第一个函数。 这是urls.py的内容:

urlpatterns = patterns('accountsearch.views',
url(r'^$', 'account_search', name='account_search'),
url(r'(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$','reset_password',name='reset_password'),
url(r'(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$','reset_securityquestions',name='reset_securityquestions'),

我正在尝试使用以下模板调用reset_securityquestions

"{% url 'reset_securityquestions'   account.uuid user.uuid %}">

但如果我将urls.py中的url顺序更改为此,它将调用reset_password:

urlpatterns = patterns('accountsearch.views',
url(r'^$', 'account_search', name='account_search'),
url(r'(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$', 'reset_securityquestions',
    name='reset_securityquestions'),
url(r'(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$', 'reset_password', name='reset_password'),

并使用以下命令调用reset_password

{% url 'reset_password' account.uuid user.uuid %}

它调用reset_security_questions函数。 我要去哪里错了?

Django总是首先匹配URL模式,因此将URL重写为:

urlpatterns = patterns('accountsearch.views',
   url(r'^$', 'account_search', name='account_search'),
   url(r'^reset-password/(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$','reset_password',name='reset_password'),
   url(r'^security-question/(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$','reset_securityquestions',name='reset_securityquestions'),

如果您的Django网址模式完全相同,我不希望您知道Django如何知道要使用哪个网址。 当请求到达时,Django所要做的就是URL本身,并且它将始终尝试按顺序匹配它们。 使用切换的模式,您会发现reset_password视图现在不起作用。

您需要为Django提供一些区分它们的方法。 通常,将使用一些文字文本作为前缀或后缀,例如:

r'reset/(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$'
r'security/(?P<account_uuid>[a-zA-Z0-9\-]+)/(?P<user_uuid>[a-zA-Z0-9\-]+)/$'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM