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

aze*_*aze 3 forms django

使用 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
Run Code Online (Sandbox Code Playgroud)

我的看法 :

class MyView(FormView):
    form_class = CustomForm
    model = MyClass
Run Code Online (Sandbox Code Playgroud)

和表单类:

class MyForm(forms.ModelForm):
    class Meta:
        model = MyClass
        fields = ?
Run Code Online (Sandbox Code Playgroud)

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

mar*_*er_ 6

我会列出您可能需要的所有可能的字段,然后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'
        )
Run Code Online (Sandbox Code Playgroud)

因此,从您的角度来看,如果您想获得表单的价值,您可以这样做;

my_object = MyClass.objects.first()
form = MyForm(instance=my_object)
context['form'] = form
# etc, etc
Run Code Online (Sandbox Code Playgroud)

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

如果需要的话,您也可以将任意 args/kwargs 传递给您的表单(假设您实际上没有一个对象来检查值,而是只想传递基于其他数据的内容;

# 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'
Run Code Online (Sandbox Code Playgroud)