zoukankan      html  css  js  c++  java
  • django 初识forms组件

    校验字段功能

    示例: 注册用户

    模型:models.py

    from django.db import models
    
    # Create your models here.
    class UserInfo(models.Model):
        name=models.CharField(max_length=32)
        pwd=models.CharField(max_length=32)
        email=models.EmailField()
        tel=models.CharField(max_length=32)
    

    实验验证功能

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    from django import forms
    
    
    # Create your views here.
    
    class UserForm(forms.Form):
        name=forms.CharField(min_length=4)
        pwd=forms.CharField(min_length=4)
        re_pwd=forms.CharField(min_length=4)
        email=forms.EmailField()
        tel=forms.CharField()
    
    def register(request):
        if request.method=='POST':
            print(request.POST)
            name=request.POST.get('name')
            form=UserForm({'name':name,'email':'123qq.com'})
            if form.is_valid():
                print(form.cleaned_data)      #如果信息正确,输出 {'name':'wang','email':'123@qq.com'}
            else:
                print(form.cleaned_data)
                print(form.errors.get('email')[0])
                print(form.errors.get('email'))
        form=UserForm()
        return render(request,'register.html',locals())
    

    register.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>register</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
              integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    <form method="post">
        <div class="container">
            <div class="row">
                {% csrf_token %}
                <div class="form-group">
    {#                name: <input type="text" name="name" class="form-control">#}
                    name: {{ form.name }}
                </div>
                <div class="form-group">
    {#                email: <input type="text" name="email" class="form-control">#}
                    email: {{ form.email }}
                </div>
                <div>
                    <input type="submit" class="btn btn-default pull-right">
                </div>
            </div>
        </div>
    </form>
    </body>
    </html>
    

    forms组件渲染标签

    渲染方式一

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
       <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    <h3>注册页面</h3>
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-lg-offset-3">
    
                    <form action="" method="post">
                        {% csrf_token %}
                        <div>
                            <label for="">用户名</label>
                            {{ form.name }}
                        </div>
                        <div>
                            <label for="">密码</label>
                            {{ form.pwd }}
                        </div>
                        <div>
                            <label for="">确认密码</label>
                            {{ form.re_pwd }}
                        </div>
                        <div>
                            <label for=""> 邮箱</label>
                            {{ form.email }}
                        </div>
    
                        <input type="submit" class="btn btn-default pull-right">
                    </form>
            </div>
        </div>
    </div>
    </body>
    </html>
    

    渲染方式二

    <div class="container">
        <div class="row">
            <div class="col-md-6 col-lg-offset-3">
    			<form action="" method="post">
                        {% csrf_token %}
    
                        {% for field in form %}
                            <div>
                                <label for="">{{ field.label }}</label>
                                {{ field }}
                            </div>
                        {% endfor %}
                        <input type="submit" class="btn btn-default pull-right">
    
    			</form>
            </div>
        </div>
    </div>
    

    渲染方式三 (不推荐, 自定义样式不方便)

    <form action="" method="post">
        {% csrf_token %}
        
        {{ form.as_p }}      // forms组件自动渲染<p></p>标签
        <input type="submit" class="btn btn-default pull-right">
    
    </form>
    

    forms组件渲染错误信息和参数配置

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    from django import forms
    from django.forms import widgets,ValidationError
    from app01.models import *
    
    
    # Create your views here.
    
    class UserForm(forms.Form):
        name=forms.CharField(min_length=4,label='姓名',
                             error_messages={'required':'该字段不能为空'},  # 当字段为空时, 自定义显示错误内容
                             widget=widgets.TextInput(attrs={'class':'form-control'}) # 标签渲染加入form-control样式
                             )
        pwd=forms.CharField(min_length=4,label='密码',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
        re_pwd=forms.CharField(min_length=4,label='重新输入',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空'},
                               )
        email=forms.EmailField(label='邮箱',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空','invalid':'格式不正确'},
                               )
        tel=forms.CharField(label='电话',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
    
    def register(request):
            form=UserForm(request.POST)
            if not form.is_valid():
                errors=form.errors.get('__all__')
        else:
            form=UserForm()
        return render(request,'register.html',locals())
    

    forms组件校验的局部钩子( clean_字段名 )

    views.py

    from django.shortcuts import render,HttpResponse,redirect
    from django import forms
    from django.forms import widgets,ValidationError
    from app01.models import *
    
    
    # Create your views here.
    
    class UserForm(forms.Form):
        name=forms.CharField(min_length=4,label='姓名',
                             error_messages={'required':'该字段不能为空'},
                             widget=widgets.TextInput(attrs={'class':'form-control'})
                             )
        pwd=forms.CharField(min_length=4,label='密码',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
        re_pwd=forms.CharField(min_length=4,label='重新输入',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空'},
                               )
        email=forms.EmailField(label='邮箱',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空','invalid':'格式不正确'},
                               )
        tel=forms.CharField(label='电话',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
    
        def clean_name(self):                        # 在forms类中添加一个方法,命名规则固定 clean_字段名
            val=self.cleaned_data.get('name')        # val固定, 写死的
            ret=UserInfo.objects.filter(name=val)
            if not ret:
                return val                           # return val固定写死
            else:
                raise ValidationError('该用户已注册') # 不符合条件时触发ValidationError异常
    
        def clean_tel(self):
            val=self.cleaned_data.get('tel')
            ret=len(val)
            if ret == 11:
                print('true')
                return val
            else:
                raise ValidationError('格式不正确')
    
    def register(request):
            form=UserForm(request.POST)
            if not form.is_valid():
                errors=form.errors.get('__all__')
        else:
            form=UserForm()
        return render(request,'register.html',locals())
    

    forms组件校验的全局钩子 ( clean )

    from django.shortcuts import render,HttpResponse,redirect
    from django import forms
    from django.forms import widgets,ValidationError
    from app01.models import *
    
    
    # Create your views here.
    
    class UserForm(forms.Form):
        name=forms.CharField(min_length=4,label='姓名',
                             error_messages={'required':'该字段不能为空'},
                             widget=widgets.TextInput(attrs={'class':'form-control'})
                             )
        pwd=forms.CharField(min_length=4,label='密码',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
        re_pwd=forms.CharField(min_length=4,label='重新输入',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空'},
                               )
        email=forms.EmailField(label='邮箱',
                               widget=widgets.TextInput(attrs={'class': 'form-control'}),
                               error_messages={'required': '该字段不能为空','invalid':'格式不正确'},
                               )
        tel=forms.CharField(label='电话',
                            widget=widgets.TextInput(attrs={'class': 'form-control'}),
                            error_messages={'required': '该字段不能为空'},
                            )
    
        def clean_name(self):
            val=self.cleaned_data.get('name')
            ret=UserInfo.objects.filter(name=val)
            if not ret:
                return val
            else:
                raise ValidationError('该用户已注册')
    
        def clean_tel(self):
            val=self.cleaned_data.get('tel')
            print(val)
            ret=len(val)
            print(ret)
            if ret == 11:
                print('true')
                return val
            else:
                raise ValidationError('格式不正确')
    
        def clean(self):                                       # 命名固定为clean
            pwd=self.cleaned_data.get('pwd')
            re_pwd=self.cleaned_data.get('re_pwd')
            if pwd and re_pwd:
                if pwd == re_pwd:
                    return self.cleaned_data                   # 符合规则, 返回self.cleaned_data
                else:
                    raise ValidationError('两次密码不一致')     # 不符合规则, 触发ValidationError异常
            else:
                return self.cleaned_data
    
    def register(request):
        if request.method=='POST':
            form=UserForm(request.POST)
            if not form.is_valid():
                errors=form.errors.get('__all__')
        else:
            form=UserForm()
        return render(request,'register.html',locals())
    
  • 相关阅读:
    C# 删除指定目录下的所有文件及文件夹
    C# 数组集合分页 Skip Take
    MongoDB模糊查询 工具
    C# skip 重试执行代码段
    C# 加载配置文件
    消息队列MSMQ的使用
    C#中const和readonly的区别
    JSP页面中的tab页
    使用jquery获取单选按钮radio的值
    JSP页面获取下来框select选中项的值和文本的方法
  • 原文地址:https://www.cnblogs.com/peitianwang/p/14390842.html
Copyright © 2011-2022 走看看