使用Django的ModelForm对表单进行自动验证(可自定义验证规则)

本文介绍如何在 Django 的 ModelForm 中实现手机号码合法性验证。通过正则表达式匹配手机号码格式,并在 ModelForm 中定义 clean 方法进行自定义验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过ModelForm可以直接验证用户键入是否符合model的设计,
但是model设计只能验证手机号码的长度, 无法验证手机号码是否合法.
这时我们就可以自己设计添加验证规则

例如:
某一在线学习网站上, 用户咨询记录表单有三个字段 如下:

这里写图片描述


model设计如下:

class UserAsk(models.Model):
    name = models.CharField(verbose_name='姓名', max_length=20)
    mobile = models.CharField(verbose_name='手机', max_length=11)
    course_name = models.CharField(verbose_name='咨询课程', max_length=100)
    add_time = models.DateTimeField(verbose_name='添加时间', auto_now_add=True)

    class Meta:
        verbose_name = '用户咨询'
        verbose_name_plural = verbose_name

Form设计如下(自定义验证规则)

import re
from django import forms
from operation.models import UserAsk

class UserAskForm(forms.ModelForm):
    class Meta:
        model =UserAsk
        fields = ['name', 'mobile', 'course_name']

    def clean_mobile(self):  # 函数必须以clean_开头
        """
        通过正则表达式验证手机号码是否合法
        """
        mobile = self.cleaned_data['mobile']
        mobile_regex = r'^1[34578]\d{9}$'
        p = re.compile(mobile_regex)
        if p.match(mobile):
            return mobile
        else:
            raise forms.ValidationError('手机号码非法', code='invalid mobile')

View设计如下:

class UserAskView(View):
    def post(self, request):
        userask_form = UserAskForm(request.POST)
        if userask_form.is_valid():
            # ModelForm可以直接将表单数据提交到数据库并保存
            user_ask = userask_form.save(commit=True)
            return HttpResponse('{"status": "success"}', content_type='application/json')
        else:
            return HttpResponse('{"status": "failure", "msg": "格式错误"}', content_type='application/json')

template Ajax代码

<script>
    $(function(){
        $('#jsStayBtn').on('click', function(){
            $.ajax({
                cache: false,
                type: "POST",
                url:"{% url 'org:user_ask' %}",
                data:$('#jsStayForm').serialize(),
                async: true,
                success: function(data) {
                    if(data.status == 'success'){
                        $('#jsStayForm')[0].reset();
                        alert("提交成功")
                    }else if(data.status == 'failure'){
                        $('#jsCompanyTips').html(data.msg)
                    }
                }
            });
        });
    })
</script>
填写错误的效果

这里写图片描述

正确时浏览器提示

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值