Django博客UpdatePostView报错需URLconf配置pk/slug问题求助
报错根因
UpdateView是Django提供的对象级编辑通用视图,运行时必须从URL中获取待操作对象的唯一标识(主键pk或slug字段)才能定位到具体的Post记录,你当前配置的编辑路由没有携带任何对象标识参数,因此触发参数缺失报错。
修复步骤
- 调整路由配置
打开urls.py,给更新视图的路径加上slug参数捕获规则,和已有的详情页、点赞路由逻辑对齐,将原编辑路由:
path('edit_post/', UpdatePostView.as_view(), name='update_post'),
替换为:
path('edit_post/<slug:slug>/', UpdatePostView.as_view(), name='update_post'),
- 修正页面跳转入口
所有指向编辑页的链接都需要传入目标文章的slug参数,比如在文章详情页、列表页放置编辑按钮时,模板标签写法如下:
<a href="{% url 'update_post' slug=post.slug %}" class="btn btn-signup">编辑文章</a>
- (可选补充)增加访问权限控制
当前视图未做权限校验,任意访问者都可以修改所有文章,建议在视图类中混入权限校验类,仅允许文章作者或管理员访问编辑页,修改views.py中的视图代码:
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.views.generic import UpdateView from .models import Post class UpdatePostView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Post template_name = 'update_post.html' fields = ('title', 'excerpt', 'slug', 'featured_image', 'content', 'author', 'status') def test_func(self): target_post = self.get_object() return self.request.user == target_post.author or self.request.user.is_superuser
你现有的update_post.html模板不需要调整结构,表单配置的action="."会自动将数据提交到当前带slug参数的编辑路由,参数配置正确后即可正常运行。
内容的提问来源于stack exchange,提问作者Jord
相关产品推荐
相关产品推荐

