/index 处的 NoReverseMatch

NoReverseMatch at /index

我想了解为什么我在尝试使用 Django Contact Form 时看到 NoReverseMatch 错误。

当我使用以下语法向 index.html 添加 link 时发生错误:

<h3><a href="{% url 'contact' %}">Contact</a></h3>

如果我使用以下硬编码语法,则不会发生任何错误,并且 index.html 到联系表的 link 会按预期工作。

<h3><a href="contact">Contact</a></h3>

我想要实现的与 Django 教程中关于 removing hard coded urls 的内容相似。

我看到的完整错误是:

NoReverseMatch at /index

Reverse for 'contact' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

如有需要,我的缩写urls.py是:

 urlpatterns = patterns('',
    ...
    url(r'index$', views.index, name='index'),
    ...
    url(r'^contact/', include('contact_form.urls')'),
 )

我知道我遗漏了一些明显的东西!

这是因为没有 url 名称为 contact

url(r'^contact/', include('contact_form.urls')'),

是 url,它将把所有以 contact 开头的 url 映射到 contact_form.urls。官方文档没有说如何访问 contact 视图,但是如果对 django 有基本的了解,我们可以这样做:

 urlpatterns = patterns('',
    ...
    url(r'index$', views.index, name='index'),
    ...
    url(r'^contact/', include('contact_form.urls', namespace='contacts')),
 )

和模板中的:

<h3><a href="{% url 'contacts:contact_form' %}">Contact</a></h3>

contact_form url 名称在 source code of the module 中找到。

当你在模板中使用{% url 'contact' %}时,'contact'实际上是路由名称。在您的 url 模式中,没有使用此名称的路线。您应该在 contact_forms.urls.py:

中包含这样的内容
url(r'$', views.index, name='contact_index')

此外,您应该将 "contact/" 模式更改为:

url(r'^contact/', include('contact_form.urls', namespace='contacts'))

然后在模板中创建 link 时使用它:

{% url 'contacts:contact_index' %}