You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django类视图方法间值传递问题:bundle与message无法传入get_context_data

问题根因

你的问题核心在于FormView的form_valid方法默认会触发重定向。重定向会生成一个全新的FirmwareView实例,你在post方法中赋值的self.bundle和self.message属于旧实例的属性,新实例里这两个变量还是__init__中初始化的空字典,所以get_context_data无法获取到更新后的值。

解决方案

提供两种可行的解决思路:

方案1:用Session临时存储数据(推荐,避免重复提交)

Session可以跨请求保存数据,重定向后新实例能从Session中读取到之前的内容:

  1. 修改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)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:42:21