调整django通用编辑视图生成的表单

时间:2019-03-04 17:24:53

标签: python django forms django-models

我试图了解在django中生成通用表单视图的过程。我只有一个普通的视图类

class BookUpdate(UpdateView):
    model = Book
    fields = [  'name',
                'pages',
                'categorys'
                ]

会根据我的模型数据自动生成一个有效的html表单。但是现在,我想修改为categorys显示的字段,是否可以执行此操作,还是必须创建一个完整的工作BookForm类和自定义BookUpdate类?在这里,它只有3个字段,但实际上,category字段中的微小变化使我需要自己编写15个字段。

我不能使用任何类方法覆盖单个字段吗?

2 个答案:

答案 0 :(得分:1)

您可以在基于类的通用视图中指定fieldsform_class。对于fields,Django将使用modelform_factory生成表单。那时您可以自定义的内容不多。

您应该创建一个BookForm类,以便您可以自定义字段。在您的BookUpdate视图中,您只需删除fields并添加form_class = BookForm。在这里,我为categorys自定义窗口小部件,并为pages覆盖表单字段:

def BookUpdate(UpdateView):
    model = Book
    form_class = BookForm

def BookForm(ModelForm):
    pages = MyCustomPagesField()

    class Meta:
        model = Book
        fields = '__all__'
        widgets = {'categorys': MyCustomWidget()}

请注意,您不必指定所有字段,可以使用"__all__"来包含所有字段,也可以将exclude = [<list fields to exclude>]设置为仅排除几个。

答案 1 :(得分:1)

您不必自己编写字段代码。但是,由于没有方法可以覆盖,因此需要做的工作很少。

您需要做的是定义一个自定义表单。由于这将是ModelForm,因此它将使用相同的逻辑来基于模型自动创建其字段。然后,您可以覆盖其中之一的定义。

class BookForm(forms.ModelForm): 
     categorys = forms.ModelMultipleChoiceField(custom_attributes_here...)

    class Meta:
        model = Book
        fields = ["name", "pages", "categorys"]

现在告诉您的视图使用该表格:

class BookUpdate(UpdateView):
    form_class = BookForm