Skip to main content
 首页 » 编程设计

python之覆盖 Django 中 ChoiceField 的初始化

2025年05月04日34haluo1

我正在尝试在 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