Django中UpdateView类如何跳转至post-detail页并发送更新成功消息
解决方案
修复跳转不生效问题
你之前配置的success_url不生效,是因为success_url需要传入完整可访问的URL字符串,而你填的post-detail是带参数的命名路由,依赖当前更新的帖子pk值,无法静态定义,需要重写get_success_url方法动态生成跳转地址。
添加更新成功提示
使用Django内置的messages组件即可实现,需要先导入对应模块,在表单验证通过的逻辑中添加提示语句,最后在模板中渲染消息。
修改后完整的PostUpdateView代码
# 顶部先导入依赖 from django.contrib import messages from django.urls import reverse from django.contrib.auth.mixins import UserPassesTestMixin from .models import Post # 其他视图保持不变,修改PostUpdateView如下 class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Post template_name = 'blog/post_create.html' fields = ['title', 'content'] def form_valid(self, form): form.instance.author = self.request.user # 添加更新成功提示 messages.success(self.request, "帖子更新成功") return super().form_valid(form) def test_func(self): post = self.get_object() return self.request.user == post.author # 动态生成跳转的帖子详情页地址 def get_success_url(self): return reverse('post-detail', kwargs={'pk': self.object.pk})
注意:原来的代码没有继承
UserPassesTestMixin,你写的test_func权限校验逻辑不会生效,补充这个Mixin后才能保证只有帖子作者可以编辑帖子。
模板添加消息渲染逻辑
在项目公共基础模板(通常是base.html)的页面顶部合适位置添加如下代码,即可展示提示消息:
{% if messages %} {% for message in messages %} <div class="alert alert-{{ message.tags }}"> {{ message }} </div> {% endfor %} {% endif %}
如果你的项目没有引入Bootstrap,自行修改div的样式即可。
内容的提问来源于stack exchange,提问作者BiswajitPaloi
相关产品推荐
相关产品推荐

