Forms组件

后端代码

from django import forms
from django.forms import widgets
from django.core.validators import RegexValidator



class MyForm(forms.Form):
    username = forms.CharField(min_length=3,
                               
                               label='用户名',
                               max_length=8,
                               #输入错误后的值
                               error_messages={
        'required': '姓名不能为空',
        'min_length': '最小3位数',
        'max_length': '最大8位数', },
                               widget=widgets.TextInput(attrs={'class': 'form-control'}))
    password = forms.CharField(min_length=3, label='密码', max_length=8, error_messages={
        'required': '密码不能为空',
        'min_length': '最小3位数',
        'max_length': '最大8位数', },
                               widget=widgets.PasswordInput(attrs={'class': 'form-control'}))

    confirm_password = forms.CharField(min_length=3, label='确认密码', max_length=8, error_messages={
        'required': '确认密码不能为空',
        'min_length': '最小3位数',
        'max_length': '最大8位数', },
                                       widget=widgets.PasswordInput(attrs={'class': 'form-control'}))

    email = forms.EmailField(label='Email', error_messages={
        'required':'邮箱不能为空',
        'invalid': '格式错误'
    }, widget=widgets.EmailInput(attrs={'class': 'form-control'}))


    #RegexValidator验证器可以用正则匹配
    phone = forms.CharField(
        validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')], )


    #局部钩子当走完上面的form校验才会走这个局部钩子函数
    def clean_username(self):
        username = self.cleaned_data.get('username')
        if username == 'hkk':
            self.add_error('username', '姓名存在')
        return username
    #全局钩子
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password != confirm_password:
            self.add_error('confirm_password', '密码不一致')
        return self.cleaned_data


def index3(request):
    form_obj = MyForm()
    if request.method == 'POST':
        form_obj = MyForm(request.POST)
        #返回为布尔值如果校验成功返回True如果校验失败返回False
        if form_obj.is_valid():

            #校验成功的后返回的字典 key为字段values为用户输入后正确的值
            print(form_obj.cleaned_data)
        print(form_obj.errors)
    return render(request, 'text3.html', {'form_obj': form_obj})

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<div class="row">
    <div class="col-md-6 col-lg-offset-3">

        <form action="" method="post" novalidate>

                {% for foo in form_obj %}
                    <div class="form-group">
                    <label for="{{ foo.auto_id }}">{{ foo.label }}</label>
                    {{ foo }}
                    <span style="color: red">{{ foo.errors.0 }}</span>
                    </div>
                {% endfor %}
                <input type="submit" value="提交">

        </form>

    </div>
</div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</html>
原文地址:https://www.cnblogs.com/huikejie/p/11227865.html