Django “模板中移除硬编码URL”无效

2 投票
4 回答
2915 浏览
提问于 2025-04-18 18:53

我正在第一次学习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 个回答

0

我刚重启了服务器,结果它奇迹般地好了。

1

检查一下你的 polls/urls.py 文件,确保你的 urlpatterns 是一个空的列表 [],而不是一个空的字典 {}。

urlpatterns = [
    path('', views.index, name='index'),
]
1

我之前也遇到过这个问题,原因是我在 { %% } 之间加了空格,而正确的写法应该是 {%%}。为了让大家更清楚,我在下面列出了正确和错误的写法:

正确的写法 - <li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>

错误的写法 - <li><a href="{ % url 'detail' poll.id % }">{{ poll.question }}</a></li>

4

这个错误提示告诉你,在闭合的大括号前面,你忘记加一个%符号了。

The current URL, polls/{% url 'detail' poll.id }, didn't match any of these.

撰写回答