python - 验证失败时,Django 自定义表单验证器不会引发异常
问题描述
我在 form.py 中设置了一个正则表达式,当我验证表单中的数字时,它成功失败并刷新表单,但不会引发 ValidationError 或显示消息。我已经尝试过 RegexField 并且也不会引发错误,但是它正确地失败了,我做错了什么?
这是视图设置的示例:
from django.shortcuts import render, redirect
from django.http import HttpResponse, Http404
from django.urls import reverse
from django.template import loader
from django.core.mail import send_mail, mail_admins
from .forms import Register
# Importing Models
from .models import Users
# Create your views here.
# Create your views here.
def register(request):
if request.method == "POST":
forms = Register(request.POST)
if forms.is_valid():
f_name = forms.cleaned_data["first_name"]
l_name = forms.cleaned_data["last_name"]
em = forms.cleaned_data["email"]
num = forms.cleaned_data["phone"]
user = Users(
first_name=f_name,
last_name=l_name,
email=em,
phone=num
)
user.save()
# Saving session
request.session['f_name'] = f_name
# User Mailing
subject = f'Welcome to JSG {f_name}'
message = 'Testing'
from_email = 'example@gmail.com'
recipient_list = [em]
user_mail = send_mail(
subject,
message,
from_email,
recipient_list,
fail_silently = False,
)
# Admin Mailing
subject = f'New member has joined the family {f_name}'
message = ( f"Name: {f_name} {l_name}\n"
f"Email: {em}\n"
f"Phone: {num}\n"
)
admin_mail = mail_admins(
subject,
message,
fail_silently = False,
)
return redirect('success')
else:
forms = Register()
context = {
'forms':forms
}
return render(request, 'register/register.html', context)
forms = Register()
title = "Join now"
context = {
'title':title,
'forms':forms,
}
return render(request, 'register/register.html', context)
def success(request):
welcome = request.session['f_name']
context = {
'welcome' : welcome
}
return render(request, 'register/success.html', context)
这是我的注册表单的forms.py:
from django import forms
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
import re
def validate_phone(val):
if not re.match(r'^(05)', val):
raise ValidationError("Not correct")
class Register(forms.Form):
first_name = forms.CharField(label="First Name", max_length=20,)
last_name = forms.CharField(label="Last Name", max_length=20)
email = forms.EmailField(label="Email",
max_length=50,
help_text="Johndoe@email.com")
phone = forms.CharField(label="Phone",
help_text="055-555-5555",
max_length=10,
min_length=10,
validators=[validate_phone])
我阅读和使用但在不显示错误时也存在相同问题的另一种方法是:
validate_phone = RegexValidator(r'^(05)\d{9}$',
"must only be numbers",
"invalid number")
phone = forms.CharField(label="Phone",
help_text="055-555-5555",
max_length=10,
min_length=10,
validators=[validate_phone])
也成功失败但不会在表单中引发错误或消息,我是否错过了一个步骤,或者是否应该以另一种方式完成以闪烁错误消息?
解决方案
推荐阅读
- c# - 将名称分配给 LINQ 匿名类型的一个或多个属性有哪些优点/缺点?
- javascript - 三个js窗口大小调整问题(不是真实的视图大小)
- string - 将字符串转换为大写
- symfony - Pimcore / Symfony 找不到“pimcore_customer_management_framework”的扩展名
- java - 字符串上的Java合并排序仅适用于最多四个元素的arraylist
- spring-boot - 创建发电机数据库表时出错 属性定义中未指定哈希键
- jquery - 如何让下面的上一个和下一个按钮循环显示下一个和上一个图像
- bash - Fedora/UNIX 中预期的整数表达式
- viewcontroller - 将数组数据从 CollectionView 传递到下一个 ViewController
- c++ - C++ 什么是 &Class::MemberVariable?