Django:在初始表单视图中禁用必填字段的错误消息?

时间:2018-04-10 16:43:54

标签: django django-forms

我有一个看起来像这样的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;。

如何在初始视图中禁用此功能?

2 个答案:

答案 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,但我的回答可能会给你提示。