我有一个看起来像这样的Django表单,并允许用户做出选择:
class ChoiceForm(forms.Form):
candidate = forms.CharField(widget=forms.HiddenInput)
CHOICES = ((True, 'Yes',), (False, 'No',))
choice_field = forms.ChoiceField(choices=CHOICES, required=True,
widget=forms.RadioSelect)
模板如下所示:
<form id="pledge" action="/pledge" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
<div class="fieldWrapper">
{{ form.choice_field.errors }}
{{ form.choice_field }}
</div>
{{ form.candidate }}
<div class="form-actions">
<button type="submit" class="btn btn-primary" value="Submit">Submit your response</button>
</div>
</form>
我的观点是这样的:
def pledge(request, candidate_hashkey=None):
candidate = None
if request.method == 'POST':
# process input
else:
candidate = get_object_or_404(Candidate, pledge_hashkey=candidate_hashkey)
form = PledgeForm({'candidate': candidate_hashkey})
context = {
'form': form,
'candidate': candidate
}
return render(request, 'frontend/pledge.html', context)
问题在于,在初始GET视图中,在用户选择任何内容之前,表单顶部会显示错误:&#34;此值是必需的&#34;。
如何在初始视图中禁用此功能?
答案 0 :(得分:2)
对于GET请求,您可以使用initial
。这意味着表单未绑定,因此不会进行验证。
if request.method == 'POST':
# process input
else:
candidate = get_object_or_404(Candidate, pledge_hashkey=candidate_hashkey)
form = PledgeForm(initial={'candidate': candidate_hashkey})
但是,从表单中完全删除candidate
字段可能更容易。要执行此操作,您必须在网址中保留哈希值(而不是action="/pledge"
,这似乎会将其删除)。
class ChoiceForm(forms.Form):
CHOICES = ((True, 'Yes',), (False, 'No',))
choice_field = forms.ChoiceField(choices=CHOICES, required=True,
widget=forms.RadioSelect)
然后在保存表单时设置candidate
字段:
if request.method == 'POST':
if form.is_valid():
obj = form.save(commit=False)
candidate = get_object_or_404(Candidate, pledge_hashkey=candidate_hashkey)
obj.candidate = candidate
obj.save()
...
答案 1 :(得分:2)
您正在为PledgeForm
绑定数据,这就是您看到错误消息的原因:
form = PledgeForm({'candidate': candidate_hashkey})
您不应该使用数据绑定表单:
form = PledgeForm()
P.S虽然你说你的表单是ChoiceForm
但是你正在使用PledgeForm
,但我的回答可能会给你提示。