Python django选择形成行为

Python django选择形成行为,python,django,Python,Django,我在Django 1.4中遇到了以下奇怪的问题: #forms.py from django import forms class MyForm(forms.Form): my_choices = forms.ChoiceField() # views.py def my_view(request): vchoices = (('a', 'AAAA'), ('b', 'BBBB'),) form = MyForm() # version1

我在Django 1.4中遇到了以下奇怪的问题:

#forms.py
from django import forms
class MyForm(forms.Form):
    my_choices = forms.ChoiceField()

# views.py
def my_view(request):
    vchoices = (('a', 'AAAA'),
               ('b', 'BBBB'),)

    form = MyForm()
# version1:
    form.my_choices=choices
# version2:
    form.my_choices.choices=vchoices

    context={'form': form}
    return render(request,index.html", {'form': form})
考虑到上述准则: 如果我使用version1,我会正确地呈现输出,当然在选项框中没有选项。 如果使用版本2,则会出现以下错误:

MyForm对象没有属性“my_choices”

怎么可能呢???在版本1中,“my_choices”属性似乎存在,至少django没有抱怨

第二个问题是: 如果我按以下方式设置我的forms.py

#forms.py
from django import forms
class MyForm(forms.Form):
    my_choices = forms.ChoiceField()
    my_choices.choices=(('a','aaaa'),('b','bbbb'))
表单已正确呈现,下拉框中包含选项

您知道如何解释这一点,或者如何在views.py中设置my_choices的属性选项吗


非常感谢

我的选择
这样的表单字段不会成为表单实例上的属性。相反,它们成为
form.fields
字典的成员。您可以从
form.fields['my_choices']
访问它

但是,通常的方法是通过表单的
\uuuu init\uuu
方法:

class MyForm(forms.Form):
    my_choices = forms.ChoiceField()

    def __init__(self, *args, **kwargs):
        choices = kwargs.pop('choices')
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['my_choices'] = choices

并用
form=MyForm(choices=my_choices)

实例化表单。在您的版本2中,它正在寻找一个“属性”,而不是一个“字段”来应用选项。动态设置选项的正确位置在Form的
\uuuuu init\uuuuuu
方法中好的,谢谢,但是你能解释一下Django用来隐藏成员的机制吗:实际上我实例化了一个从forms.Form继承的类(MyForm)。此类具有类似my_choices的属性。如何管理这些属性使其不可见??form.fields['my_choices'].choices=(,),(,))有什么不对?它不是“隐藏”成员,只是表单字段和模型字段一样,由元类处理,以将声明性语法转换为实例级属性。要获得完整的解释,您需要查看代码或Marty Alchin的好书Pro Django。