Django如何通过URL链接在视图间传递变量且不使用session?
问题诊断
- 模板中生成editpage路由时未传递必填的topic参数:你在urls.py中定义的editpage路由明确要求携带
str:topic路径参数,但是page.html的跳转链接、editpage.html的表单提交路径都没有传入该参数,会直接触发路由匹配错误。 - editpage视图未利用路由传递的topic参数:你已经在editpage的视图参数中声明了topic变量,POST请求阶段可以直接调用该变量获取对应主题,不需要额外从POST请求中读取。
- 编辑页未预填充现有内容:GET请求打开编辑页时没有将对应主题的已有内容填入表单,不符合编辑功能的常规逻辑。
修复方案
1. 修改page.html
将跳转编辑页的链接补充topic参数,直接把当前页面的topic变量传入路由生成逻辑:
{% extends "encyclopedia/layout.html" %} {% block title %} {{ topic }} {% endblock %} {% block body %} <!-- 补充topic参数生成正确的编辑页路径 --> <a href="{% url 'editpage' topic=topic %}">Edit this page</a><br> {{ content }} {% endblock %}
2. 修改views.py的editpage视图
直接使用路由传入的topic参数,GET请求时预填充表单内容,POST请求时直接用该参数处理保存逻辑:
def editpage(request, topic): # 提前校验主题是否存在 if not util.get_entry(topic): return render(request, "encyclopedia/notfound.html") if request.method == "POST": # 直接使用路由传递的topic参数,不需要从POST中读取 new_content = request.POST.get("content") # 调用你的保存逻辑,比如util.save_entry(topic, new_content) util.save_entry(topic, new_content) # 编辑完成后跳回对应主题的详情页 return HttpResponseRedirect(reverse("page", args=[topic])) else: # GET请求时预填充表单的现有内容 current_content = util.get_entry(topic) form = NewSubmissionForm(initial={"content": current_content}) return render(request, "encyclopedia/editpage.html", { "form": form, "topic": topic # 将topic传递给模板用于生成表单提交路径 })
注:以上代码假设你的NewSubmissionForm表单类中用于提交内容的字段名为content,可根据你实际的表单定义调整字段名。
3. 修改editpage.html
给表单提交路径补充topic参数:
{% extends "encyclopedia/layout.html" %} {% block title %} Edit Page {% endblock %} {% block body %} <h1>Edit page</h1> <!-- 补充topic参数生成正确的提交路径 --> <form action="{% url 'editpage' topic=topic %}" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="submit"> </form> {% endblock %}
内容的提问来源于stack exchange,提问作者cjuggler
相关产品推荐
相关产品推荐

