代码之家  ›  专栏  ›  技术社区  ›  aze

Python Django ModelForm,如何在呈现表单字段之前根据模型修改表单字段

  •  1
  • aze  · 技术社区  · 8 年前

    使用ModelForm,模型包含一个字段的值,我应该以以下形式呈现:

    class MyClass(models.Model):
        my_field = models.CharField(max_length=256) # this contains the type of the form's field for example a CharField or a DateTimeField
    

    我的观点:

    class MyView(FormView):
        form_class = CustomForm
        model = MyClass
    

    和form类:

    class MyForm(forms.ModelForm):
        class Meta:
            model = MyClass
            fields = ?
    

    如何动态设置表单的字段类型?

    1 回复  |  直到 8 年前
        1
  •  3
  •   markwalker_    8 年前

    我会列出你可能需要的所有字段 fields = () 然后,您可以删除不需要的字段,如果需要字段,则进行更改,等等,基于模型字段的值,如下所示;

    class MyForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            super(MyForm, self).__init__(*args, **kwargs)
            if self.instance:
                if self.instance.my_field == 'value':
                    del self.fields['my_field']  # remove 'my_field'
                    self.fields['name'].required = False  # change required value
    
        class Meta:
            model = MyClass
            fields = (
                'name',
                'address',
                'my_field',
                'some_other_field'
            )
    

    因此,从你的角度来看,如果你想让你的表单有一个价值,你可以这样做;

    my_object = MyClass.objects.first()
    form = MyForm(instance=my_object)
    context['form'] = form
    # etc, etc
    

    然后,您可以从该对象上的字段中获取值,就像我上面建议的那样。

    如果需要的话,您也可以将任意的arg/kwarg传递给您的表单(比如说,您实际上没有一个对象可以从中检查值,而是希望只传递基于其他数据的内容;

    # in a view;
    form = MyForm(my_var='something')
    
    # in the form;
    class MyForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            my_var = kwargs.pop('my_var')
            super(MyForm, self).__init__(*args, **kwargs)
            if my_var == 'value':
                del self.fields['my_field']  # remove 'my_field'