Django CreateView上下文数据未更新,提交后模态框无法保持开启问题
问题根本原因
CreateView父类的form_valid方法默认会执行POST重定向GET(PRG)逻辑,你在post/form_valid中修改的self.successful_submit仅属于当前POST请求的类实例,重定向后会触发全新的GET请求,类实例会重新初始化,successful_submit会重置为初始值False,所以模板始终拿不到True的状态。
两种无需修改urls.py的解决方案
方案1:取消重定向,同请求直接返回渲染结果
适合不需要避免重复提交的场景,直接在表单验证通过后返回当前模板,不触发跳转:
class MescData(CreateView): model = Mesc form_class = MescForm template_name = 'Materials/mesc_data.html' def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) # 把标记默认值放到context里统一管理,不用定义类属性 context['successful_submit'] = kwargs.pop('successful_submit', False) return context def get_success_url(self): return reverse('mesc') def form_valid(self, form, **kwargs): # 先保存表单数据 form.save() # 直接构建context返回,传递成功标记 return self.render_to_response( self.get_context_data( successful_submit=True, form=self.form_class() # 加这行提交后清空表单,不需要可以删掉 ) )
方案2:用session存储状态,兼容PRG模式
适合需要避免用户刷新页面重复提交表单的场景,提交后走正常重定向,通过session临时存储提交状态:
class MescData(CreateView): model = Mesc form_class = MescForm template_name = 'Materials/mesc_data.html' def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) # 从session取状态,pop操作会取出后删除该键,保证状态仅生效一次 context['successful_submit'] = self.request.session.pop('successful_submit', False) return context def get_success_url(self): return reverse('mesc') def form_valid(self, form, **kwargs): # 提交成功后给session存标记 self.request.session['successful_submit'] = True return super().form_valid(form, **kwargs)
模态框保持开启的配套处理
模板中拿到成功标记后,用JS控制Bootstrap模态框保持显示即可,示例:
{% if successful_submit %} <script> // 替换成你自己的模态框ID $('#mesc-form-modal').modal('show'); </script> {% endif %}
内容的提问来源于stack exchange,提问作者Naeem Khan
相关产品推荐
相关产品推荐

