首页 > 解决方案 > 验证失败时,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])

也成功失败但不会在表单中引发错误或消息,我是否错过了一个步骤,或者是否应该以另一种方式完成以闪烁错误消息?

这是发布后的结果 在此处输入图像描述

标签: pythondjangodjango-viewsdjango-formsdjango-validation

解决方案


推荐阅读