Django基础View类调用success_url方法后重定向不生效问题
问题原因
- 你虽然定义了
get_success_url方法,但在表单校验通过的分支中没有调用该方法,也没有返回重定向响应,仍然返回了编辑页面的渲染结果,所以不会触发跳转。 - Django中实现页面跳转需要返回
HttpResponseRedirect类的响应,通常可以直接用django.shortcuts.redirect快捷方法生成该类响应。
修正方案
- 先确认你已经导入redirect方法:
from django.shortcuts import render, get_object_or_404, redirect
- 修改
post方法的逻辑,表单校验保存成功后返回重定向响应,修正后的视图完整代码如下:
class ArticleUpdateView(View): template_name = 'articles/article_edit.html' def get_success_url(self): id = self.kwargs.get('id') return reverse('articles:article-detail', kwargs={'id': id}) def get_object(self): id = self.kwargs.get('id') if id is not None: return get_object_or_404(Article, id=id) return None def get(self, request, id=None, *args, **kwargs): context = {} obj = self.get_object() if obj is not None: form = ArticleModelForm(instance=obj) context['article'] = obj context['form'] = form return render(request, self.template_name, context) def post(self, request, id=None, *args, **kwargs): obj = self.get_object() if obj is None: # 可按需添加404处理逻辑 return render(request, self.template_name, {}) form = ArticleModelForm(request.POST, instance=obj) if form.is_valid(): form.save() # 这里调用你写的get_success_url方法返回重定向地址 return redirect(self.get_success_url()) # 因为你模型已经定义了get_absolute_url,也可以简化写成 return redirect(obj) 效果完全一致 # 表单校验失败才走渲染编辑页逻辑,回显错误信息 context = { 'article': obj, 'form': form } return render(request, self.template_name, context)
补充说明
原生UpdateView内部已经封装了「表单校验通过后返回重定向响应」的逻辑,所以直接用的时候不需要自己写跳转,你用基础View实现就需要手动处理这一步的返回值。
内容的提问来源于stack exchange,提问作者Jarvis Millan
相关产品推荐
相关产品推荐

