我正在尝试在 Django 中初始化一个包含 ChoiceField 的表单。我有以下代码:
# 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()]
但是在 shell 上,一旦我尝试实例化:
r = RegisterForm(username="toto", email="a@b.com")
我收到 'RegisterForm' 对象没有属性 'fields' 错误。这是因为对象尚未形成而发生的吗?如何访问 ChoiceField?
感谢任何帮助。
请您参考如下方法:
您没有以正确的方式使用 Form 对象。 fields 属性初始化 by the __init__ method of BaseForm (see the source code) (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()]
我已将所有 *Field 声明移到 __init__ 之外,因为这是常见的方式。它的问题与之前的问题非常相似:Override defaults attributes of a Django form
