如何在特定场景下将Django ModelForm隐藏字段设为True?
解决Django隐藏字段
finished无法设为True的问题 问题根源
当表单通过instance参数绑定数据库对象时,字段的渲染值会优先取自instance的属性值,而非你设置的initial。你的代码里虽然在__init__中设置了self.fields["finished"].initial = True,但因为instance=self.object的finished值是False,所以这个设置被覆盖,最终渲染出的还是value="False"。
两种可行解决方案
方案1:修改表单绑定的实例属性
在视图中初始化表单前,先修改实例的finished属性(若不想影响原数据库对象,可复制实例后修改):
# 可选:复制实例,避免修改原数据库对象 temp_instance = self.object temp_instance.finished = True context["test_form"] = TestForm( instance=temp_instance, hide_status=True, is_finished=True )
方案2:直接修改字段widget的value属性
在表单的__init__方法中,跳过initial,直接设置隐藏输入框的value属性,强制覆盖instance的值:
class TestForm(ModelForm): finished = forms.BooleanField( widget=forms.HiddenInput(), initial=False, required=False ) status = forms.Select(attrs={"class": "form-control"}) def __init__(self, *args, **kwargs): hide_status = kwargs.pop("hide_status", None) is_finished = kwargs.pop("is_finished", None) super().__init__(*args, **kwargs) self.fields["status"].queryset = Status.objects.filter(active=True) self.fields["status"].widget.attrs["class"] = "form-control" if hide_status: self.fields["status"].widget = HiddenInput() if is_finished: # 直接设置widget的value,覆盖instance的值 self.fields["finished"].widget.attrs['value'] = 'True' class Meta: model = Test fields = ["finished", "status"]
验证效果
修改后渲染的HTML会变为:
<input type="hidden" name="finished" value="True" id="id_finished">
内容的提问来源于stack exchange,提问作者UpDawg
相关产品推荐
相关产品推荐

