为什么会出现 Django crispy 表单隐藏字段?

Why Django crispy form hidden fields appear?

我有一个模型:

class MyModel(models.Model):
    normal = models.CharField(null=True, blank=True, max_length=100)
    other = models.CharField(null=True, blank=True, max_length=100)
    hidden = models.CharField(null=True, blank=True, max_length=100)

如果我在不使用 exclude 的情况下定义常规表单,则隐藏字段会显示在 DOM(和 UI)中提交按钮之后的 UI 上:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('normal', 'hidden')

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(form=self)
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-10'

        self.helper.layout = Layout(
            'normal',
            Hidden('hidden', 'hidden initial'),
            FormActions(
                Submit('save', 'Save', css_class='save-entry btn-success'),
            )
        )

现在,如果我翻转过来,assemble 基本等效的形式但使用 exclude,隐藏字段不会出现(这正是我们想要的)。

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        exclude = ('other',)

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(form=self)
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-10'

        self.helper.layout = Layout(
            'normal',
            Hidden('hidden', 'hidden initial'),
            FormActions(
                Submit('save', 'Save', css_class='save-entry btn-success'),
            )
        )

我想不通为什么会这样。

Hidden 布局用于创建隐藏输入。您可以添加任何 Hidden 元素,即使它没有在您的表单中声明。在你的例子中,如果你检查元素,你可以看到有一个隐藏的输入叫做 hidden.

你需要做什么而不是使用 Hidden 布局,你需要做这样的事情:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ('normal', 'hidden',)

    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper(form=self)
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-sm-3 col-md-2'
        self.helper.field_class = 'col-sm-9 col-md-10'

        self.helper.layout = Layout(
            'normal',
            Field('hidden', type='hidden'),
            FormActions(
                Submit('save', 'Save', css_class='save-entry btn-success'),
            )
        )