Python 覆盖django中ChoiceField的初始化
我试图在django中初始化一个包含Python 覆盖django中ChoiceField的初始化,python,django,django-forms,Python,Django,Django Forms,我试图在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
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()]
但在外壳上,一旦我尝试实例化:
r=注册执行(用户名=“toto”,电子邮件=”a@b.com))
我收到“RegisterForm”对象没有属性“fields”错误
。这是因为物体还没有形成吗?如何访问选项字段
感谢您的帮助。您没有以良好的方式使用
表单
对象。字段
属性是initialize(forms.Form的父类),但是您已经重新定义了它,因此中断了进程
因此,您应该在\uuuuu init\uuuu
方法中调用父级\uuuuu init\uuuu
,如下所示:
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()]
我已将每个
*字段
声明移到\uuuuu init\uuuuu
之外,因为这是常见的方式。这个问题与前一个问题非常相似:您没有很好地使用表单
对象。字段
属性是initialize(forms.Form的父类),但是您已经重新定义了它,因此中断了进程
因此,您应该在\uuuuu init\uuuu
方法中调用父级\uuuuu init\uuuu
,如下所示:
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()]
我已将每个*字段
声明移到\uuuuu init\uuuuu
之外,因为这是常见的方式。这个问题与前一个问题非常相似:试试:
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()]
尝试:
该列表将在声明表单时创建。如果他在服务器启动后在Location中添加新值,则此新值将不在选项列表中。相反,每次实例化新表单时都会调用
\uuuu init\uuuuuu
函数。@maximelrant选项的格式必须是[(…,,,(…,,,,,,)
@maximelrant我在所有项目中都使用此方法,它工作正常。即使您修改/删除位置中的数据
?也许你是对的,通过快速查看课堂,我看到发生了一些深度复制。。。有一些疑问,但好吧,我取消我的反对票:)@MaximeLorant是的,你是对的。我不是那个意思。我说的是[(…,…)..
该列表将在表单声明时创建。如果他在服务器启动后在Location中添加新值,则该新值将不在选项列表中。相反,每次实例化新表单时都会调用\uuuu init\uuuu
函数。@MaximeLant选项的格式必须为[(…,,,,,,,,,…]
@MaximeLorant我在我所有的项目中都使用了这种方法,而且效果很好。即使你修改/删除了地区的数据
?也许你是对的,通过快速查看类,我看到出现了一些deepcopy…有一些疑问,但好吧,我删除了我的反对票:)@MaximeLorant是的,你是对的。我不是这个意思。我说的是[(..,..)
更新,就在我看到你的评论之前,self.fields['locality'].choices=[l.locality for l in locality.objects.all()]
是错误的。你必须使用self.fields['locality'].choices=[(l.id,l.locality)for l in locality.objects.all()][/code>我的意思是选择必须采用[(..,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]格式]
你说得对,我只是复制了作者的一行,没有检查列表的理解,但想法就在这里;)(再次更新)您好,Maxime,谢谢您的回答,听起来很符合逻辑。但是forms.Form.\uuuu init\uuuuuuuu不是一个可识别的符号,并且在BaseForm中使用init:几分钟前,我用super
语法修改了我的答案;)在看到您的注释self.fields['locality']之前进行了更新。choices=[l.locality for l in locality.objects.all()]
是错误的。你必须使用self.fields['locality'].choices=[(l.id,l.locality)来表示l in locality.objects.all()]
我的意思是选择必须是格式[(…,…,(…,),…]
你是对的,我只是复制了作者的一行,没有检查列表的理解,但想法在这里;)(再次更新)您好,Maxime,谢谢您的回答,听起来很符合逻辑。但是forms.Form.\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu