覆盖django中ChoiceField的初始化

Jua*_*Chô 1 python django django-forms

我正在尝试初始化一个包含ChoiceField在django中的表单.我有以下代码:

# in file models.py
class Locality(models.Model):
    locality = models.CharField(primary_key=True, unique=True, max_length=36)
    def __unicode__(self):
        return self.locality

# in file forms.py
class RegisterForm(forms.Form): 
    def __init__(self, *args, **kwargs):
        self.username = forms.CharField(required=True)
        self.email = forms.EmailField(required=True)
        self.locality = forms.ChoiceField(widget=forms.Select())
        self.fields['locality'].choices = [l.locality for l in Locality.objects.all()]
Run Code Online (Sandbox Code Playgroud)

但是,一旦我尝试实例化,我就会在外壳上:

r = RegisterForm(username ="toto",email ="a@b.com")

我收到了'RegisterForm' object has no attribute 'fields' error.这是否因为物体尚未形成而发生?我怎样才能访问ChoiceField?

任何帮助赞赏.

Max*_*ant 5

你没有以Form良好的方式使用这个对象.该fields属性是通过__init__BaseForm 的方法初始化的(参见源代码)(父类forms.Form),但是你重新定义了它,所以你打破了这个过程.

所以,你应该__init__在你的__init__方法中调用父类,如下所示:

class RegisterForm(forms.Form): 
    username = forms.CharField(required=True)
    email = forms.EmailField(required=True)
    locality = forms.ChoiceField(widget=forms.Select())

    def __init__(self, *args, **kwargs):
         super(forms.Form, self).__init__(*args, **kwargs)
         self.fields['locality'].choices = [(l.id, l.locality) for l in Locality.objects.all()]
Run Code Online (Sandbox Code Playgroud)

我把所有*Field宣言都移到了外面__init__,因为这是常见的方式.它的问题与前一个问题非常相似:覆盖Django表单的默认属性