2013-03-08 82 views
0

我已经得到了以下奇怪的问题在Django 1.4:Django的选择,形成行为

#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 object has no attribute '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')) 

形式正确地呈现,并且下拉框中包含的选择。

任何想法如何解释这一点,或如何设置my.choices的属性选择在views.py?

非常感谢

+0

在您的第2版中,它正在寻找“属性”,而不是“字段”来应用选择。动态设置选项的正确位置在表格 – karthikr 2013-03-08 15:50:33

回答

1

my_choices表单域不会成为形式实例的属性。相反,他们成为form.fields字典的成员。您可以从form.fields['my_choices']访问它。

但是对于普通的方式做到这一点是通过形式的__init__方法:

类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)

+0

形式的__init__方法中,好的,谢谢,但是您能否解释Django用于隐藏成员的机制:实际上,我实例化了一个从Forms.Form继承的类(MyForm) 。这个类有像my_choices这样的属性。如何管理这些属性变得不可见? form.fields ['my_choices']。wrong =((,),(,))? – ProfHase85 2013-03-08 16:04:03

+0

它不是“隐藏”成员,只是表单字段(如模型字段)由元类处理,以将该声明性语法转换为实例级属性。要获得完整的解释,您需要查看代码或查看Marty Alchin的杰出书籍* Pro Django *。 – 2013-03-08 17:23:59