2013-08-20 4 views
2

Джанго формы поездки меня много раз ...дает начальное значение поднимает «значение поля требуется» ошибка в Джанго

я дал начальное значение для ChoiceField (инициализации Формы класса)

self.fields['thread_type'] = forms.ChoiceField(choices=choices, 
    widget=forms.Select, 
    initial=thread_type) 

Форма, созданная с помощью thread_type с указанным выше кодом, не проходит is_valid(), потому что это поле (thread_type) требуется '.

-EDIT-
нашел исправление, но он все еще довольно озадачивает меня.

У меня был код в шаблоне

{% if request.user.is_administrator() %} 
     <div class="select-post-type-div">                                                           
     {{form.thread_type}}                                                              
     </div> 
    {% endif %} 

и когда эта форма получает представлены, request.POST не имеет «thread_type», когда пользователь не администратор.

функция вида создает форму со следующим кодом:

form = forms.MyForm(request.POST, otherVar=otherVar) 

Я не понимаю, почему дают начальное значение с помощью следующего (то же самое, что и выше) не достаточно.

self.fields['thread_type'] = forms.ChoiceField(choices=choices, 
     widget=forms.Select, 
     initial=thread_type) 

И, в том числе thread_type переменной в request.POST позволяет форму, чтобы пройти проверку is_valid().

Форма код класса выглядит следующим образом

class EditQuestionForm(PostAsSomeoneForm, PostPrivatelyForm): 
    title = TitleField() 
    tags = TagNamesField() 


    #some more fields.. but removed for brevity, thread_type isn't defined here 

    def __init__(self, *args, **kwargs): 
     """populate EditQuestionForm with initial data""" 
     self.question = kwargs.pop('question') 
     self.user = kwargs.pop('user')#preserve for superclass                                                     
     thread_type = kwargs.pop('thread_type', self.question.thread.thread_type) 
     revision = kwargs.pop('revision') 
     super(EditQuestionForm, self).__init__(*args, **kwargs) 
     #it is important to add this field dynamically  

     self.fields['thread_type'] = forms.ChoiceField(choices=choices, widget=forms.Select, initial=thread_type) 
+2

Можете ли вы показать больше кода? когда вы запускаете эту строку? – YardenST

+0

Спасибо. обновил вопрос с помощью кода relavant. – eugene

ответ

1

Вместо добавления этого поля динамически, определить его в классе соответствующим образом:

class EditQuestionForm(PostAsSomeoneForm, PostPrivatelyForm): 
    title = TitleField() 
    tags = TagNamesField() 
    thread_type = forms.ChoiceField(choices=choices, widget=forms.Select) 

При создании экземпляра формы набора в intitial значение, если необходимо:

form = EditQuestionForm(initial={'tread_type': thread_type}) 

И если вам не нужно это поле, просто удалите его это:

class EditQuestionForm(PostAsSomeoneForm, PostPrivatelyForm): 
    def __init__(self, *args, **kwargs): 
     super(EditQuestionForm, self).__init__(*args, **kwargs) 
     if some_condition: 
      del self.fields['thread_type'] 

При сохранении формы, проверьте:

thread_type = self.cleaned_data['thread_type'] if 'thread_type' in self.cleaned_data else None 

Этот подход всегда работает хорошо для меня.

+0

, конечно, может адаптировать ваш способ сделать это. Я предпочитаю устанавливать инициалы внутри класса Form, если это возможно. Потому что то, что для использования в качестве начального значения иногда может принимать довольно много кода, и я не хочу его в своих представлениях ... – eugene

+0

вы все равно можете установить начальное значение внутри класса, по какой-то причине я думал, что вам нужно установить его динамически каждый раз – YardenST

+0

Я могу установить начальное значение внутри класса, но .is_valid() вызовет ошибку, если требуется поле и задано начальное значение, но не задано значение – eugene