2013-02-26 58 views
0

我想顯示一個包含一些自定義用戶數據的表單。更具體地說,我想爲每個用戶填寫一個forms.ChoiceField不同的數據。Django,創建後在表單中設置ChoiceField

這是我Form

class WallPostForm(forms.Form): 
    text = forms.CharField(label=u'', widget=TinyMCE(attrs={'cols': 70, 'rows': 5})) 
    relates_to = forms.ChoiceField(label=u'Relates to', choices=[], widget=forms.Select(), required=False) 

    def __init__(self, data): 
     self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=data, widget=forms.Select(), required=False) 
     super(WallPostForm, self).__init__() 

這是我如何打電話這一點:

user = get_object_or_404(User, username=username) 
data = UserTopics.objects.filter(user=user, result=0).values('id', 'topic__name')[:10] 
form = WallPostForm(data) 

我得到一個'WallPostForm' object has no attribute 'fields'錯誤。

我在做什麼錯?

回答

2

Django在__init__中設置表格的fields屬性。

所以只要將代碼:

def __init__(self, data): 
    super(WallPostForm, self).__init__() 
    self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=data, widget=forms.Select(), required=False) 

雖然,你可能不應該重寫Form__init__這樣。 Django的表單系統期望init中的data arg包含表單的數據,而不是用於選擇字段的查詢集。

我重寫它不同:

def __init__(self, *args, **kwargs): 
    relates_to_queryset = kwargs.pop('relates_to_queryset') 
    super(WallPostForm, self).__init__(*args, **kwargs) 
    self.fields['relates_to'] = forms.ChoiceField(label=u'Relates to', choices=relates_to_queryset, widget=forms.Select(), required=False) 

然後調用它:

form = WallPostForm(request.POST or None, relates_to_queryset=data) 
3

作爲除了傑克的答案,你可能會更好過剛剛更換choices屬性,而不是整個字段:

def __init__(self, *args, **kwargs): 
    relates_to_choices = kwargs.pop('relates_to_choices') 
    super(WallPostForm, self).__init__(*args, **kwargs) 
    self.fields['relates_to'].choices = relates_to_choices 

(我改名了變量,它不會是查詢。等)

+0

好編輯。我沒有真正想過:D – 2013-02-26 11:56:40

+0

這是真的。感謝您的輸入。對不起,我不能接受這兩個答案是正確的。 – xpanta 2013-02-26 14:19:10