Django Crispyforms在提交或填写表单之前抛出验证错误

Django Crispyforms在提交或填写表单之前抛出验证错误,django,django-forms,Django,Django Forms,我正在使用crispyforms在django中定制我的表单。 但是,在我将任何内容写入或提交到该字段之前,它会给我该字段所需的验证错误。它应该只告诉我一个错误时,提交没有填写字段 如果表单未填写,如何使验证错误仅在提交后显示 谢谢你的阅读 HTML文件 <form method="post"> {% csrf_token %} <div class="form-row"> <div class="form-group">

我正在使用crispyforms在django中定制我的表单。 但是,在我将任何内容写入或提交到该字段之前,它会给我该字段所需的验证错误。它应该只告诉我一个错误时,提交没有填写字段

如果表单未填写,如何使验证错误仅在提交后显示

谢谢你的阅读

HTML文件

    <form method="post">
    {% csrf_token %}
    <div class="form-row">
      <div class="form-group">
        {{ form.name|as_crispy_field }}
      </div>
    </div>
    <div class="form-row">
      <div class="form-group">
        {{ form.interest_rating|as_crispy_field }}
      </div>
    </div>
      {{ form.interest|as_crispy_field }}
      <div class="form-row">
      <div class="form-group">
        {{ form.clarity_rating|as_crispy_field }}
      </div>
      <div class="form-group">
        {{ form.clarity|as_crispy_field }}
      </div>
      <div class="form-group ">
        {{ form.brevity_rating|as_crispy_field }}
      </div>
      <div class="form-group">
        {{ form.brevity|as_crispy_field }}
      </div>
      <div class="form-group ">
        {{ form.not_good|as_crispy_field }}
      </div>
      <div class="form-group ">
        {{ form.general_comments|as_crispy_field }}
      </div>
      </div>
    <button type="submit" class="btn btn-primary">Sign in</button>
  </form>
          <br/>
          <br/>
    </div>
  </div>
</div>
我的观点

def readerpage(request, content_id):
    content = get_object_or_404(Content, pk=content_id)
    form = ReviewForm(request.POST)
    if form.is_valid():
        review = form.save(commit=False)
        review.content = content
        interest_rating = form.cleaned_data['interest_rating']
        interest = form.cleaned_data['interest']
        clarity_rating = form.cleaned_data['clarity_rating']
        clarity = form.cleaned_data['clarity']
        brevity_rating = form.cleaned_data['clarity_rating']
        brevity = form.cleaned_data['clarity']
        not_good = form.cleaned_data['not_good']
        general_comments = form.cleaned_data['general_comments']
        review.avg_rating = (float(interest_rating) +
                             float(clarity_rating) + float(brevity_rating)) / 3
        review.pub_date = timezone.datetime.now()
        review.save()
        return redirect('home')
    args = {'content': content, 'form': form}
    return render(request, 'content/readerpage.html', args)

这不是一个简单的表单问题,只是您无条件地尝试验证并保存表单,而不首先检查它是GET还是POST请求。你想要:

def readerpage(request, content_id):
    content = get_object_or_404(Content, pk=content_id)
    if request.method == "POST":
        form = ReviewForm(request.POST)
        if form.is_valid():
            review = form.save(commit=False)
            # XXX snip lots of code that doesn't belong here
            # -- all this should be handled by the form itself, 
            # (or by the model for the avg_rating part)
            # the view should only have to call `form.save()`.
            # ... 
            review.save()
            return redirect('home')
    else:
        # GET request, present an unbound form
        form = ReviewForm()

    context = {'content': content, 'form': form}
    return render(request, 'content/readerpage.html', content)
def readerpage(request, content_id):
    content = get_object_or_404(Content, pk=content_id)
    if request.method == "POST":
        form = ReviewForm(request.POST)
        if form.is_valid():
            review = form.save(commit=False)
            # XXX snip lots of code that doesn't belong here
            # -- all this should be handled by the form itself, 
            # (or by the model for the avg_rating part)
            # the view should only have to call `form.save()`.
            # ... 
            review.save()
            return redirect('home')
    else:
        # GET request, present an unbound form
        form = ReviewForm()

    context = {'content': content, 'form': form}
    return render(request, 'content/readerpage.html', content)