代码之家  ›  专栏  ›  技术社区  ›  Jimm Chen

好奇的是,为什么我不能检索我自己的Django表单类的属性?

  •  0
  • Jimm Chen  · 技术社区  · 7 年前

    在Django项目shell(Python 3.5+Django 1.11)中,我尝试了以下语句:

    from django import forms
    
    class ContactForm(forms.Form):
        subject = forms.CharField()
        email = forms.EmailField(required=False)
        message = forms.CharField()
    
    print( ContactForm.subject )
    

    但我可以 把我的 ContactForm.subject 属性。我收到错误消息:

    AttributeError: type object 'ContactForm' has no attribute 'subject'
    

    为什么会这样?它是由某种隐藏的Python语言技巧引起的吗?

    enter image description here

    1 回复  |  直到 7 年前
        1
  •  3
  •   AKX Bryan Oakley    7 年前

    是的,表单有一个特殊的元类,它将定义的字段提升到 form.base_fields .

    所以如果你需要进入那个区域,你可以 ContactForm.base_fields['subject'] ,但请注意对该字段的修改 将持续 跨越请求。

    如果只需要为单个请求修改表单字段,请重写表单的 __init__ ,然后在中修改表单字段 self.fields (注: base_fields ),这是本课程 .base_fields ,创建于 Form.__init__ .

    例如,如果您需要为每个用户做一些事情——将其放入代码中,

    class MyForm(forms.Form):
        field = forms.CharField(label='Boo')
    
        def __init__(self, user, **kwargs):
           # We'll assume whatever instantiates this form knows
           # to pass the user object in; for CBVs,
           # that's an override of `get_form_kwargs()`.
           super().__init__(**kwargs)
           if user.is_superuser:
               self.fields['field'].label = 'Yay!'