Django “模板中移除硬编码URL”无效
我正在第一次学习Django,跟着这个教程 https://docs.djangoproject.com/en/1.6/intro/tutorial03/
到目前为止,一切都很顺利。不过在“去掉硬编码的URL”这一部分遇到了一些麻烦。我用的是Django 1.6.6。
当我把硬编码的URL从:
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
改成:
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
结果出现了404错误,具体信息如下:
Page not found (404)
Request Method: GET
Request URL: http://localhost:8000/polls/%7B%%20url%20'detail'%20poll.id%20%7D
Using the URLconf defined in mysite.urls, Django tried these URL patterns, in this order:
^polls/ ^$ [name='index']
^polls/ ^(?P<poll_id>\d+)/$ [name='detail']
^polls/ ^(?P<poll_id>\d+)/results/$ [name='results']
^polls/ ^(?P<poll_id>\d+)/vote/$ [name='vote']
^admin/
The current URL, polls/{% url 'detail' poll.id }, didn't match any of these.
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
地址栏显示的URL是
mylocalenv/polls/%7B%%20url%20%27detail%27%20poll.id%20%7D
我试着把'detail'里的引号去掉,但因为我用的是Django 1.6.6,所以其实不应该需要这样做。结果也没用。我还试着跳过一些步骤,在urls.py里加上/polls/这个命名空间,但还是不行。
我的urls.py文件看起来是这样的:
from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
# ex: /polls/
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)
我在index.html模板里的确切代码是:
{% if latest_poll_list %}
<ul>
{% for poll in latest_poll_list %}
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
明白了
但让我感到沮丧的是,我完全不知道为什么会这样。出于绝望,我在index.html的这一行开始尝试:
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
没有任何逻辑原因,我把poll.id改成了poll_id。重新加载后,果然index.html坏掉了。然后我把它改回poll.id,一切又正常了。这真是没道理。我甚至用ctrl^z把之前不工作的index.html恢复了,现在它也能工作了。我在每次检查之前都重启了服务器。真让人烦。不过至少现在它能用了。
4 个回答
我刚重启了服务器,结果它奇迹般地好了。
检查一下你的 polls/urls.py 文件,确保你的 urlpatterns 是一个空的列表 [],而不是一个空的字典 {}。
urlpatterns = [
path('', views.index, name='index'),
]
我之前也遇到过这个问题,原因是我在 { %
和 % }
之间加了空格,而正确的写法应该是 {%
和 %}
。为了让大家更清楚,我在下面列出了正确和错误的写法:
正确的写法 - <li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
错误的写法 - <li><a href="{ % url 'detail' poll.id % }">{{ poll.question }}</a></li>
这个错误提示告诉你,在闭合的大括号前面,你忘记加一个%
符号了。
The current URL, polls/{% url 'detail' poll.id }, didn't match any of these.