You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django edit_blog_post路由反向解析空参数报错问题排查

问题根因

报错由两个问题直接导致:

  1. 单篇博客详情页的blog_post视图未将博客ID传入模板上下文,模板中blog_post.id取值为空,无法匹配要求传入数字ID参数的edit_blog_post路由规则
  2. 博客编辑页模板存在模板标签语法错误,即使修复跳转问题,访问编辑页时也会触发新报错
    不需要调整现有页面结构、不需要将编辑按钮迁移到博客列表页,仅补全视图传参、修复语法错误即可实现需求。
具体修复代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:12:25