基于类的视图重定向失效:为何一个CreateView有效另一个无效?
CreateView重定向一个生效一个失效的原因分析
先看你提供的代码:
class LoveLetterCreateView(LoginRequiredMixin, CreateView): model = LoveLetter fields = '__all__' success_url = reverse_lazy('login') # 无效 class SignUpView(CreateView): form_class = UserCreationForm success_url = reverse_lazy('login') # 有效 template_name = 'love_letters/signup.html'
核心原因大概率是LoveLetter表单未通过验证,导致CreateView没有执行重定向逻辑:
SignUpView使用的UserCreationForm是Django内置表单,字段逻辑明确(用户名、两次密码),前端提交时基本能满足验证要求,表单验证通过后就会触发success_url重定向。LoveLetterCreateView用了fields='__all__',如果LoveLetter模型中存在必填字段(即blank=False且null=False的字段),但提交的表单未填写这些字段,就会导致表单验证失败。此时CreateView会重新渲染表单页面,不会执行重定向,看起来就像success_url无效。
另外,如果你重写get_success_url仍无效,进一步说明问题出在表单验证环节——只有表单验证通过,才会调用get_success_url方法。
解决步骤:
- 在模板中添加表单错误提示:
{{ form.errors }},查看具体的验证失败原因。 - 检查
LoveLetter模型的字段定义,确认是否有未被表单正确提交的必填字段,要么在表单中补充这些字段,要么修改模型字段为允许为空(设置blank=True)。 - 可以在
LoveLetterCreateView中重写form_valid方法,打印调试信息确认是否执行到该方法:def form_valid(self, form): print("表单验证通过,即将重定向") return super().form_valid(form)
内容的提问来源于stack exchange,提问作者Yuval Fadlon
相关产品推荐
相关产品推荐

