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

Django MultipleChoiceField提交更新后模板仍展示初始值问题求助

问题根源

你在get_context_data中修改表单值的方式不符合Django表单的设计逻辑,直接给form实例挂载liquid_choices、from_date这类自定义属性不会被模板渲染逻辑识别,Django渲染表单字段时只会读取初始化阶段传入的初始值、绑定的模型实例或提交数据。

修复方案

你使用的是ModelForm,最简单的方式是在初始化表单时直接传入你从数据库查到的LiquidAssetModel实例,不用手动逐个给字段赋值。你可以选择修改get_form方法(更符合FormView的设计规范),代替原来get_context_data中修改表单的逻辑:

步骤1:删除get_context_data中多余的表单处理逻辑

把get_context_data里下面这段代码删掉:

form_class = self.get_form_class()
form = self.get_form(form_class)
the_obj = LiquidAssetModel.objects.all()

if len(the_obj) == 0:
    #no forms saved yet
    pass
else:
    form.liquid_choices = the_obj.values('liquid_choices')[0]
    form.from_date = the_obj.values('from_date')[0]
    form.to_date = the_obj.values('to_date')[0]

print (form.liquid_choices)

context.update({'form': form})

这段逻辑完全不需要,super().get_context_data(**kwargs)已经默认生成了form字段放在上下文里。

步骤2:给LiquidView新增get_form方法

在LiquidView类中添加如下方法:

def get_form(self, form_class=None):
    form = super().get_form(form_class)
    # 取数据库中第一条配置,你每次提交都会清空旧数据,最多只有一条
    latest_config = LiquidAssetModel.objects.first()
    if latest_config:
        # 给ModelForm绑定实例,表单会自动加载实例的字段值作为初始值
        form.instance = latest_config
    return form

可选优化

你当前的success_url指向/thanksLiquid/,对应的视图也是LiquidView,完全可以直接修改success_url复用已命名的路由,不用单独维护冗余路由:

from django.urls import reverse_lazy

class LiquidView(FormView):
    template_name = 'liquid_chart.html'
    form_class = forms.LiquidAssetsForm
    # 替换原来的success_url
    success_url = reverse_lazy('Liquid_Charts')
    liq_file_name = ''

修改后可以删除urls.py中path('thanksLiquid/', views.LiquidView.as_view()),这条冗余配置。


内容的提问来源于stack exchange,提问作者Willie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:06:04