Django模板渲染报错:点击会议跳转演讲列表触发NoReverseMatch异常
错误原因
你遇到的NoReverseMatch错误是Django模板引擎解析了HTML注释内的模板标签导致的:
- TALKS.HTML中你用HTML注释符
<!-- -->包裹了包含{% url %}标签的代码块,Django并不会跳过HTML注释内的模板语法,依然会尝试解析{% url 'conferenceedit' conferences.conference_title %}这段代码。 - 你的
talkView视图只给模板传递了conferencetalks变量,没有传递conferences变量,所以conferences.conference_title取值为空字符串,无法匹配conferenceedit路由要求的id参数,最终抛出反向匹配失败错误。
解决方案
方案1(直接修复注释问题,无需修改其他代码)
将TALKS.HTML里的HTML注释替换为Django专用模板注释:
把原来的
<!-- <td> <a href="{% url 'conferenceedit' conferences.conference_title %}" class="btn btn-danger btn-sm">Edit</a> <form action="{% url 'conferencedelete' conferences.conference_title %}" method="POST" class="d-inline"> {% csrf_token %} <input type="submit" value="Delete" class="btn btn-danger btn-sm"> </form> </td> -->
替换为
{# <td> <a href="{% url 'conferenceedit' conferences.conference_title %}" class="btn btn-danger btn-sm">Edit</a> <form action="{% url 'conferencedelete' conferences.conference_title %}" method="POST" class="d-inline"> {% csrf_token %} <input type="submit" value="Delete" class="btn btn-danger btn-sm"> </form> </td> #}
Django模板引擎会直接忽略{# #}包裹的所有内容,不会解析其中的模板标签,错误就会消失。
方案2(如果你后续需要用到这段编辑/删除功能)
- 先修改
talkView视图,将当前会议的标题传递给模板:
def talkView(request,id): talk = ConferenceModel.objects.get(pk=id) conferencetalks = talk.talkmodel_set.all() # 新增传递conference_title参数 return render(request,'myapp/talks.html',{'conferencetalks':conferencetalks, 'conference_title':id})
- 把TALKS.HTML注释内的
conferences.conference_title替换为conference_title,再取消注释即可正常使用。
可选优化建议
你当前用会议标题作为主键,后续如果需要修改会议标题会连带修改所有关联的外键数据,建议给ConferenceModel新增自增ID作为主键,标题仅作为普通字段存储,避免后续维护问题。
内容的提问来源于stack exchange,提问作者Akshat Sharma
相关产品推荐
相关产品推荐

