2013-03-08 65 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