Python django选择形成行为
我在Django 1.4中遇到了以下奇怪的问题: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
#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。