我试图了解在django中生成通用表单视图的过程。我只有一个普通的视图类
class BookUpdate(UpdateView):
model = Book
fields = [ 'name',
'pages',
'categorys'
]
会根据我的模型数据自动生成一个有效的html表单。但是现在,我想修改为categorys
显示的字段,是否可以执行此操作,还是必须创建一个完整的工作BookForm
类和自定义BookUpdate
类?在这里,它只有3个字段,但实际上,category
字段中的微小变化使我需要自己编写15个字段。
我不能使用任何类方法覆盖单个字段吗?
答案 0 :(得分:1)
您可以在基于类的通用视图中指定fields
或form_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