如何覆盖__init__添加实例表单.Form Django

时间:2015-12-09 22:19:56

标签: python django

我想在我的forms.Form中添加一个实例参数,这样我就可以在视图中初始化它并在我的表单中获得预期的结果。我知道我可以使用'initial',但我想尝试不同的东西。

Views.py

city_form = CityForm(instance=user.profile.city)

Forms.py

class CityForm(forms.Form):
    post_nr = forms.CharField(max_length=5, widget=forms.TextInput(attrs={'placeholder': 'Post nr.'}))
    city = forms.CharField(required=False, max_length=30, widget=forms.TextInput(attrs={'placeholder': 'By', 'readonly': True}))

    class Meta:
        model = City

    def __init__(self, *args, **kwargs):
        self.instance = kwargs.pop('instance', None)

        if self.instance:
            self.fields['post_nr'] = self.instance.post_code
            self.fields['city'] = self.instance.name

        super(CityForm, self).__init__(*args, **kwargs)

引用的实例将是一个City对象,来自我的City类,它具有我在上面指定的变量。

但我得到了:

  

'CityForm'对象没有属性'field'

1 个答案:

答案 0 :(得分:1)

在您致电fields之前,表单没有super().__init__()属性。您需要移动该代码。您当前正在做的是使用其值覆盖字段实例。相反,您应该设置初始值:

def __init__(self, *args, **kwargs):
    self.instance = kwargs.pop('instance', None)

    super(CityForm, self).__init__(*args, **kwargs)

    if self.instance:
        self.initial['post_nr'] = self.instance.post_code
        self.initial['city'] = self.instance.name

您可能还想查看使用ModelForm