【发布时间】:2011-06-07 17:53:22
【问题描述】:
我是 Django 新手,已经开始从事一个成熟的 Django 项目。
我想向用户帐户屏幕添加一个新页面,并链接到它。但我收到 NoReverseMatch 错误。
到 /users/urls.py 我添加了:
url(r'^panel/history$',
'theproject.users.views.history',
name='account_history'
),
...与上面一行一致:
url(r'^panel$',
'theproject.users.views.control_panel',
name='account_panel'
),
到 /users/views.py 我添加了:
@login_required
def history(request):
return render_to_response('users/ourbrand_history.html', {},
context_instance=RequestContext(request))
...与上面一行一致:
@login_required
def control_panel(request):
return render_to_response('users/ourbrand_panel.html', {},
context_instance=RequestContext(request))
到 /templates/users/ourbrand_panel.html 我添加了:
<a href="{% url account_history %}">History</a>
...与上面一行一致:
<a href="{% url account_panel %}">Home</a>
现在当我加载 /panel 时,我得到一个 TemplateSyntaxError: NoReverseMatch。
Reverse for 'account_history' with arguments '()' and keyword arguments '{}' not found.
更新:作为测试,我删除了模板中的链接——并且 /panel 加载正常。如果我然后删除 /users/urls.py 和 /users/views.py /panel 仍然加载。我已删除所有 cookie、历史记录等。我是否必须在终端上运行命令(如 ruby 中的 rake)才能提交对 urls.py 的更改?还是应该改变“正常工作”?
【问题讨论】:
-
据我所知,一切看起来都是正确的(尽管尾随斜杠是个好主意,正如@pastylegs 所说)。是否有一些你没有剪切/粘贴的东西,另一行中的一些小语法错误可能会影响它?可能是一个额外的引号 " 或者改变模板读取方式的东西?
-
而且(尽管我假设您剪切/粘贴代码并且显示的内容是正确的) - 您可能会仔细检查您是否始终在任何地方使用下划线
_,并且没有意外使用连字符-:) 我只是在测试我的命名 URL,切换我用于下划线的连字符(这有效)。但是当我混合它们时,它产生了同样的错误。 -
如果您正在运行 Django 开发服务器,所有文件更改都会导致服务器重新加载文件,因此您无需提交任何内容。但是,在模板中 - 如果一个变量不存在,它只会计算为一个空字符串,它不会给您任何错误,因此页面将正常加载。
-
根据@pastylegs 的回答,我确实添加了斜杠。我三重检查了所有语法:没有额外的引号或连字符而不是下划线。您说“在模板中 - 如果变量不存在......页面将正常加载。”如果这是真的,为什么 Django 抱怨在 urlpatterns 中找不到
account_history的反向? -
Wups,你是对的 - 它不是像
{{ foo }}这样的变量,它是一个 标签,{% url foo %}。我把那些搞混了。 :) 其他可以尝试的东西:from django.core.urlresolvers import reverse,在返回之前的某个地方,print reverse('account_history')。
标签: django