如何修复Django报错“Reverse for 'poll_details' with arguments '('',)' not found”
Django反向解析'poll_details'失败错误解决
问题场景
- 误删Django项目中的
db.sqlite3文件,执行python manage.py migrate无法重建数据库,最终通过python manage.py migrate --run-syncdb完成重建 - 启动服务器访问首页(原数据库存在投票数据,预期显示无投票的空白提示)时,出现如下错误:
Reverse for 'poll_details' with arguments '('',)' not found. 1 pattern(s) tried: ['poll/(?P<question_id>[0-9]+)$']
问题原因
查看首页模板代码,{% for %}循环的逻辑结构错误:{% empty %}块之后的<li>和<a>标签没有被包裹在for循环的正常分支内。当数据库中没有Question数据时,questions为空列表,{% empty %}块会执行,但后续的<a href="{% url 'poll:poll_details' question.id %}">代码依然会被渲染——此时question对象不存在,question.id为空字符串,不符合poll_details路由要求的数字类型参数,因此触发反向解析失败。
解决方案
修正模板的for循环结构,将正常循环的内容放在{% for question in questions %}和{% empty %}之间,确保只有当存在question数据时才渲染跳转链接:
修正后的首页模板(index.html)
{% block body %} <h1> Polls </h1> <ol> {% for question in questions %} <li>{{ question }}</li> <a href="{% url 'poll:poll_details' question.id %}"> View Poll </a> {% empty %} <p> There are no polls yet</p> {% endfor %} </ol> {% endblock %}
补充说明
- 视图和
Question模型代码本身无问题,错误仅来自模板的循环逻辑结构 - 重建数据库后,若需要测试数据,可通过Django的
fixture或手动创建Question实例添加数据
内容的提问来源于stack exchange,提问作者O.G Bellz
相关产品推荐
相关产品推荐

