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

2024-05-14 18:41:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解在django中生成泛型表单视图的过程。我有一个通用视图类

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

从我的模型数据自动生成一个工作的html表单。但是现在,我想修改为categorys显示的字段,有什么方法可以做到这一点,还是必须创建一个完整的工作BookForm类和自定义BookUpdate类?这里只有3个字段,但在我的实际例子中,可能有15个字段需要我自己编写代码,只是因为category字段中有一个微小的变化。你知道吗

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


Tags: django方法name视图表单fieldsmodel过程
2条回答

您不必自己对字段进行编码。但是有少量的工作要做,因为没有一个方法可以覆盖。你知道吗

您需要做的是定义一个自定义窗体。因为这将是一个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

您可以在基于泛型类的视图中指定fieldsform_class。使用fields,Django将使用modelform\u工厂来生成表单。没有什么可以定制的。你知道吗

您应该创建一个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>]设置为仅排除一对字段。你知道吗

相关问题 更多 >

    热门问题