Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖django中ChoiceField的初始化_Python_Django_Django Forms - Fatal编程技术网

Python 覆盖django中ChoiceField的初始化

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

我试图在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()]
但在外壳上,一旦我尝试实例化:

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