【问题标题】:404 on a simple template view - strange404 在一个简单的模板视图上 - 奇怪
【发布时间】:2013-08-04 03:01:33
【问题描述】:

我有一个由 ListViews、TemplateViews 等组成的 django 应用程序。 所以,我只是像这样添加了一个小的模板视图:

#views.py
class TermsTemplateView(TemplateView):
    template_name = "terms.html"

#urls.py
url(r'^terms/$', TermsTemplateView.as_view(), name='terms'),

在 terms.html 中,我用于链接:

<a href="{% url 'terms' %}">Terms & Conditions</a>

出于某种奇怪的原因,我在 localhost/terms 上不断收到 404,如下所示:

404: No <model_name> found matching the query

我很困惑为什么会突然发生这种情况。我为"about", "thanks", "contact" 页面设置了相同的设置,它们似乎可以毫无问题地显示它。

..最糟糕的是,如果我像这样修改 urls.py:

url(r'^/terms/$', TermsTemplateView.as_view(), name='terms'),

然后转到http://127.0.0.1:8000//terms/ - 页面似乎在那里.. 我很惊讶为什么会这样:(

任何帮助都会启发我!

【问题讨论】:

  • 正则表达式末尾的/ 怎么样 - 如果您删除它并尝试localhost/terms 会怎样?如果没有帮助,请出示您的urls.py
  • 天哪!你是对的。当我从 urls.py 中取出 / 并转到 localhost/terms 时,它可以工作。为什么这样??我现在很困惑。另外,请将其作为答案 - 我会接受。
  • 太棒了!请看答案。

标签: django django-templates django-urls


【解决方案1】:

最后的/ 是你问题的罪魁祸首。 localhost/terms 不匹配 '^terms/$' 正则表达式,localhost/terms/ 匹配。

您可以使用? 将最后的/ 设为可选:

url(r'^terms/?$', TermsTemplateView.as_view(), name='terms'),

UPD:注意这个问题有更好的解决方案,APPEND_SLASH

当设置为 True 时,如果请求 URL 不匹配任何 URLconf 中的模式,它不以斜杠结尾,一个 HTTP 将重定向发送到带有斜杠的相同 URL。

另见:

【讨论】:

  • 只是想知道:其他 url 怎么似乎与 thw / 一起工作?这方面的最佳做法是什么?感谢您的所有帮助。
  • 当然,请参阅答案的UPD 部分。
  • 谢谢.. 跟进...但是 APPEND_SLASH 的默认值是 true - 所以,我还需要把它放在我的 settings.py 中吗?
  • 是的,你是对的。这实际上并不是关于使用APPEND_SLASH,而是更多地了解如果设置为True,它是如何工作的。首先,它会尝试将 url 与不带斜线的正则表达式匹配,然后,如果不匹配,它会再次通过您的 urlpatterns 并附加斜线。而且,最有可能的是,它匹配了错误的项目,在^terms/$..你能显示你的urls.py吗?
  • 嗯,您应该始终注意您的urlpatterns 的排序方式。此外,如果可能,请尝试使您的正则表达式更精确、更准确..如何确保其他 url 未被捕获 - 编写测试 :)
猜你喜欢
  • 2016-02-28
  • 1970-01-01
  • 2013-05-17
  • 2013-12-14
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多