Django类视图方法间值传递问题:bundle与message无法传入get_context_data
问题根因
你的问题核心在于FormView的form_valid方法默认会触发重定向。重定向会生成一个全新的FirmwareView实例,你在post方法中赋值的self.bundle和self.message属于旧实例的属性,新实例里这两个变量还是__init__中初始化的空字典,所以get_context_data无法获取到更新后的值。
解决方案
提供两种可行的解决思路:
方案1:用Session临时存储数据(推荐,避免重复提交)
Session可以跨请求保存数据,重定向后新实例能从Session中读取到之前的内容:
- 修改
post方法中的赋值逻辑,把数据存入Session:
def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): if request.FILES and "file" in request.FILES: file = request.FILES["file"] try: content = json.loads(file.read().decode('utf-8')) folder_name = utils.format_folder_name(content["title"]) units = [unit for unit in content["units"]] # 把数据存入session self.request.session['bundle'] = { "units": units, "file": { "name": folder_name, "content": json.dumps(content) } } self.request.session['message'] = { "type": "info", "content": "The form was parsed successfully" } except Exception as e: print("there was an error", e) return self.form_valid(form) else: print("the form is invalid") return self.form_invalid(form)
- 修改
get_context_data从Session中读取数据,读完后移除避免重复显示:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 从session取出数据,没有则用空字典 context["bundle"] = self.request.session.pop('bundle', {}) context["msg"] = self.request.session.pop('message', {}) return context
方案2:跳过重定向,直接渲染模板
修改form_valid方法,不触发重定向,直接用当前实例的属性渲染模板,这样self.bundle和self.message不会丢失:
def form_valid(self, form): if isinstance(form, forms.InitialFirmwareForm2): # 跳过父类的重定向逻辑,直接渲染模板 context = self.get_context_data(form=form) return self.render_to_response(context)
注意:此方案存在弊端——用户刷新页面会重复提交表单,适合对重复提交不敏感的场景。
内容的提问来源于stack exchange,提问作者Swantewit
相关产品推荐
相关产品推荐

