如何子类化modelform(使用模型中的额外字段进行扩展)?

2024-09-30 08:29:16 发布

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

我有一个模型和一个表格:

class MyModel(models.Model):
    field_foo = models.CharField(_("Foo"), max_length=50)
    field_bar = models.IntegerField(_("Bar"))

class MyFormOne(forms.ModelForm):
    class Meta:
        model=MyModel
        fields = ('field_foo', )
        widgets = {'field_foo': forms.TextInput(attrs={'size': 10, 'maxlength': 50}),}

我想要另一个表单MyFormTwo,它将通过包含字段field_bar来子类化该表单。我的重点是不必重复第二种形式的field_foo的小部件声明(DRY原则),也不必重复来自MyFormOne的字段列表(实际上,比上面的简单示例中有更多的字段)。在

我应该如何定义MyFormTwo?在


Tags: 模型表单fieldmodelfoomodelsbarforms
3条回答

您不必显式声明整个小部件,只需修改不同的属性即可。 或者,如果您在实际代码中有自定义小部件,我也会

  1. 创建一个自定义的模型字段类,默认情况下使用该小部件,如果这是一个通用条件,那么在表单类中它只是“自动”工作。在
  2. 如果它只是特定于表单的(不是特定于模型的),那么对于这种情况,我只需在表单类上显式声明表单字段,而不是在Meta中声明,然后以一种直接的方式应用继承。在

但是对于默认的widgets(带有自定义属性),我会尝试如下方法

class MyModel(models.Model):
    field_foo = models.CharField(_("Foo"), max_length=50)
    field_bar = models.IntegerField(_("Bar"))

class MyFormOne(forms.ModelForm):
    class Meta:
        model=MyModel
        fields = ('field_foo', )

    def __init__(*args, **kwargs):
        super(MyFormOne, self).__init__(*args, **kwargs)

        self.fields['field_foo'].widget.attrs['size'] = 10
        # max_length should already be set automatically from model
        # TextInput is also default widget for CharField

class MyFormTwo(MyFormOne):
    class Meta:
        model=MyModel
        fields = MyFormOne.Meta.fields + ('field_foo2',)

    def __init__(*args, **kwargs):
        super(MyFormTwo, self).__init__(*args, **kwargs)

        self.fields['field_foo2'].widget.attrs['size'] = 10

我不确定这是否有效(它完全没有经过Django表单/模型的测试),但它是否会让我知道。在

class MyModel(models.Model):
    field_foo = models.CharField(_("Foo"), max_length=50)
    field_bar = models.IntegerField(_("Bar"))

class MyFormOne(forms.ModelForm):
    class Meta:
        model=MyModel
        fields = ('field_foo', )
        widgets = {'field_foo': forms.TextInput(attrs={'size': 10, 'maxlength': 50}),}

class MyFormTwo(MyFormOne):
    class Meta(MyFormOne.Meta):
        fields = MyFormOne.Meta.fields + ('field_foo2',)
        widgets = MyFormOne.Meta.widgets
        # Add new fields as a dictionary
        widgets.update({'field_foo2': forms.TextInput(attrs={'size': 10, 'maxlength': 50}),)
        # Or add them one by one
        widgets['field_foo3'] = forms.TextInput(attrs={'size': 10, 'maxlength': 50})

再说一次,我不知道这是否对你有帮助。请告诉我你得到了什么结果。在

这段代码有点旧,但它解释了我能够让表单多重继承工作的唯一方法。很难看。在

http://djangosnippets.org/snippets/703/

还有一张关于它的公开票:https://code.djangoproject.com/ticket/7018

相关问题 更多 >

    热门问题