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
相关产品推荐
相关产品推荐

