2013-02-26 4 views
0

Я хочу отобразить форму с некоторыми пользовательскими данными в ней. В частности, я хочу заполнить forms.ChoiceField различными данными для каждого пользователя.Django, set 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 устанавливает вид fields формы в __init__.

Так просто поменять код:

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 «s __init__ подобное. Система форм Django ожидает, что аргумент data в init должен содержать данные для формы, а не набор запросов, который вы используете для поля выбора.

Я бы переопределить это по-другому:

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 –

+0

это правда. Спасибо за ваш вклад. Извините, я не могу принять оба ответа как правильные. – xpanta

Смежные вопросы