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

时间:2014-10-22 16:58:40

标签: python regex django

我有一个urls.py文件,其中包含多个具有相同命名参数和正则表达式但名称不同的网址。当我使用{%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 %}">

但它会调用reset_password,如果我将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_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函数。我哪里错了?

2 个答案:

答案 0 :(得分:1)

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'),

答案 1 :(得分:0)

我不明白你是如何期望Django知道如果它们具有完全相同的url模式的URL。当请求进入时,所有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\-]+)/$'