【问题标题】:Validation errors don't show in Django form验证错误不显示在 Django 表单中
【发布时间】:2015-12-31 12:20:39
【问题描述】:

当我尝试使用已输入数据库的电子邮件测试我的表单时,它没有给出应有的错误消息,而是重定向回主页。

我的 views.py 文件如下所示:

from django.shortcuts import render
from .forms import LotteryForm
from django.http import HttpResponseRedirect

# Create your views here.
def lottery_list(request):
    return render(request, 'lottery/lottery.html', {})

def lottery_new(request):
   if request.method == 'POST':
       form = LotteryForm(request.POST)
       if form.is_valid():
           form.save()
            return HttpResponseRedirect('lottery_submitted')
       else:
            return render(request, 'lottery/lottery.html' {'form': LotteryForm()})
   else:  
       form = LotteryForm()
       return render(request, 'lottery/lottery.html', {'form': LotteryForm()})

我的表格是:

from django import forms
from django.db import models
from django.forms import ModelForm
from .models import Lottery
from .models import Lottery_user
from django.core.exceptions import ValidationError

class LotteryForm(forms.ModelForm):
    lottery_type = forms.ModelChoiceField(queryset = Lottery.objects.all(), empty_label=None)
    first_name = forms.CharField(required=True)
    last_name = forms.CharField(required=True)
    lottery_numbers = forms.CharField(max_length=12, required=True)
    email = forms.EmailField(required=True)
    telephone = forms.CharField(max_length=18,
                  error_messages={'invalid':'Enter a valid mobile number',
                                  'required':'Enter a valid mobile number'})

    def clean_email(self):
        email = self.cleaned_data['email']
        if Lottery_user.objects.filter(email=email).exists():
             raise ValidationError("Email already exists")
             return email
        if Lottery_user.objects.filter(email=self.cleaned_data['email']).exists():
            raise ValidationError("You've already entered")
            return email

    class Meta:
         model = Lottery_user
         fields = ['lottery_numbers', 'lottery_type', 'first_name', 'last_name', 'email', 'telephone',]

模板形式:

 <form action="{% url 'lottery_new'  %}" method="post">
        {% csrf_token %}
        <div class="fieldWrapper">
            <label for="lotterytype">Choose a lottery:</label>
            {{ form.lottery_type }}
            <p>See <a href=lottery_instructions>instructions and rules</a></p>
        </div>
        <div class="fieldWrapper">
            <label for="lotterynumbers">Lottery Numbers:</label>
            {{ form.lottery_numbers }}
        </div>
        <div class="fieldWrapper">
            <label for="firstname">First name:</label>
            {{ form.first_name }}
        </div>
        <div class="fieldWrapper">
            <label for="lastname">Last name:</label>
            {{ form.last_name }}
        </div>
        <div class="fieldWrapper">
            {{ form.email.errors }}
            {{ form.email.non_field_errors }}
            <label for="email">Email:</label>
            {{ form.email }}
        </div>
        <div class="fieldWrapper">
            <label for="phonenumber">Telephone Number:</label>
            {{ form.telephone }}
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
    </form>

我希望用户不能使用同一个电子邮件输入两次,因此当用户单击使用使用的电子邮件地址提交时应该会出错。

另外,有谁知道如何在用户提交之前而不是之后显示错误消息?

【问题讨论】:

  • 您能否在模板中附加用于呈现表单的代码。
  • 我刚刚为你添加了它

标签: django django-forms django-views


【解决方案1】:

当表单无效时,您返回一个新实例化的表单,而您应该返回无效表单(带有错误)。试试:

def lottery_new(request):
   if request.method == 'POST':
       form = LotteryForm(request.POST)
       if form.is_valid():
           ....
       else:
           return render(request, 'lottery/lottery.html' {'form': form})

【讨论】:

  • 谢谢,成功了。虽然,它仍然允许我在提交表单的同时给出错误消息。
  • 您知道为什么我无法在用户提交之前显示错误消息吗?
  • @CNB :很明显,因为验证发生在服务器上,所以在用户实际提交表单之前,没有什么可以验证 xD
  • @CNB:布鲁诺说的是正确的。通常,您可以使用 javascript(在某种程度上是 HTML5)进行客户端验证,但在您的情况下,您必须检查数据库是否存在电子邮件,因此您必须先提交电子邮件(即表单)才能进行该检查.
猜你喜欢
  • 2012-04-05
  • 2013-12-08
  • 2019-01-30
  • 1970-01-01
  • 2020-11-14
  • 2019-07-01
  • 2020-12-09
  • 2021-01-01
  • 2014-11-06
相关资源
最近更新 更多