Django edit_blog_post路由反向解析空参数报错问题排查
问题根因
报错由两个问题直接导致:
- 单篇博客详情页的
blog_post视图未将博客ID传入模板上下文,模板中blog_post.id取值为空,无法匹配要求传入数字ID参数的edit_blog_post路由规则 - 博客编辑页模板存在模板标签语法错误,即使修复跳转问题,访问编辑页时也会触发新报错
不需要调整现有页面结构、不需要将编辑按钮迁移到博客列表页,仅补全视图传参、修复语法错误即可实现需求。
具体修复代码
1. 补全views.py的导入与视图传参
首先补全缺失的快捷方法导入,然后给详情页视图补充传入博客ID参数:
# 补全原代码缺失的render、redirect导入 from django.shortcuts import render, redirect from .models import BlogPost from .forms import BlogPostForm def index(request): """博客首页""" return render(request, 'blogs/index.html') def blog_posts(request): """展示所有博客列表""" blog_posts = BlogPost.objects.order_by('date_added') context = {'blog_posts': blog_posts} return render(request, 'blogs/blog_posts.html', context) def blog_post(request, blog_post_id): """展示单篇博客详情""" blog_post = BlogPost.objects.get(id=blog_post_id) title = blog_post.title date = blog_post.date_added text = blog_post.text # 补充传入blog_post_id,供编辑链接调用 context = {'title': title, 'text': text, 'date': date, 'blog_post_id': blog_post_id} return render(request, 'blogs/blog_post.html', context) def new_blog_post(request): """发布新博客""" if request.method != 'POST': form = BlogPostForm() else: form = BlogPostForm(data=request.POST) if form.is_valid(): form.save() return redirect('blogs:blog_posts') context = {'form': form} return render(request, 'blogs/new_blog_post.html', context) def edit_blog_post(request, blog_post_id): """编辑已有博客""" blog_post = BlogPost.objects.get(id=blog_post_id) if request.method != 'POST': form = BlogPostForm(instance=blog_post) else: form = BlogPostForm(instance=blog_post, data=request.POST) if form.is_valid(): form.save() return redirect('blogs:blog_post', blog_post_id=blog_post.id) context = {'blog_post': blog_post, 'form': form} return render(request, 'blogs/edit_blog_post.html', context)
2. 修改blog_post.html的编辑链接参数
将原来引用不存在变量的blog_post.id替换为视图传入的blog_post_id,其他页面内容完全保留:
{% extends 'blogs/base.html' %} {% block content %} <p>Blog Post: {{ title }}</p> <p>Entry:</p> <p>{{ text }}</p> <p>{{ date }}</p> <p> <!-- 替换参数为视图传入的blog_post_id --> <a href="{% url 'blogs:edit_blog_post' blog_post_id %}">Edit Blog Post</a> </p> {% endblock content %}
3. 修复edit_blog_post.html的模板语法错误
原代码中返回详情页的链接漏写了url标签关键字,补上即可:
{% extends "blogs/base.html" %} {% block content %} <p> <!-- 补全缺失的url关键字 --> <a href="{% url 'blogs:blog_post' blog_post.id %}">{{ blog_post }}</a> </p> <p>Edit Blog Post</p> <form action="{% url 'blogs:edit_blog_post' blog_post.id %}" method='post'> {% csrf_token %} {{ form.as_p }} <button name="submit">Save Changes</button> </form> {% endblock content %}
验证说明
修改完成后重启Django服务,从博客列表点进任意单篇详情页,点击编辑按钮即可正常跳转到对应文章的编辑页,完全保留原有页面布局,不需要重构列表页结构。
内容的提问来源于stack exchange,提问作者Eric D
相关产品推荐
相关产品推荐

