CS50项目1:Django两个带字符串参数路径触发NoReverseError如何解决
问题原因及修复方案
核心报错原因
触发NoReverseMatch的根本原因是模板渲染时没有传入title参数,导致模板调用{% url %}标签时传递的title为空字符串,无法匹配路由要求的非空字符串规则。
具体修复步骤
- 修复
get_entry视图的上下文传参
在views.get_entry函数中,两个render返回的上下文都需要补充title参数:
def get_entry(request, title): exists = util.get_entry(title) if exists is None: return render(request, "encyclopedia/get_entry.html", { "entry": "Entry Does Not Exist", "title": title # 新增此行 }) else: entry = markdown(util.get_entry(title)) return render(request, "encyclopedia/get_entry.html", { "entry": entry, "title": title # 新增此行 })
- 修复
edit_entry视图的两处问题
- GET请求渲染模板时补充
title参数到上下文 - 修正拼写错误
HttpRespnseRedirect为HttpResponseRedirect,可直接用Django内置的redirect方法简化代码
from django.shortcuts import redirect def edit_entry(request, title): if request.method == "POST": form = NewEditEntryForm(request.POST) if form.is_valid(): title = form.cleaned_data["title"] content = form.cleaned_data["content"] util.save_entry(title, content) # 用reverse逻辑拼接路径,避免手动拼接出错 return redirect("get_entry", title=title) else: return render(request, "encyclopedia/edit_entry.html",{ "form": NewEditEntryForm(), "title": title # 新增此行 })
- 修复
edit_entry.html的模板语法错误
模板中form标签多写了一个提前闭合的</form>,会导致表单内容不被识别,修正如下:
{% extends "encyclopedia/layout.html" %} {% block title %} Edit Entry {% endblock %} {% block body %} <h1>Edit {{ title }}</h1> <!-- 移除原标签后多余的</form> --> <form action = "{% url 'edit_entry' title=title %}" method = "POST"> {% csrf_token %} {{ form }} <input type = submit value = "Save"> </form> {% endblock %}
- 可选优化
给create_entry路由末尾添加斜杠,和其他路由规则保持一致,避免Django的APPEND_SLASH重定向带来的潜在问题:
path("create_entry/", views.create_entry, name = "create_entry")
内容的提问来源于stack exchange,提问作者skateb2020
相关产品推荐
相关产品推荐

