Django表单让我绊倒了很多次......
我给一个 ChoiceField 初始值(表单类的init )
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”。
view 函数使用以下代码创建表单:
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)