如何重写 __init__ 添加实例 forms.Form Django

Ev.*_*Ev. 1 python django

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

视图.py

city_form = CityForm(instance=user.profile.city)
Run Code Online (Sandbox Code Playgroud)

表格.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)
Run Code Online (Sandbox Code Playgroud)

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

但我得到:

“CityForm”对象没有属性“field”

knb*_*nbk 5

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

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

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

    if instance:
        self.initial['post_nr'] = instance.post_code
        self.initial['city'] = instance.name
Run Code Online (Sandbox Code Playgroud)

您可能还想看看使用ModelForm.