我有一个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函数。我哪里错了?
答案 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\-]+)/$'