zoukankan      html  css  js  c++  java
  • Django 框架 Form组件

    一、Form组件简介

      Form组件是django中一个非常强大的组件,在处理服务端和前端的交互上大大的提高了开发人员的开发速度。

      Form组件的功能:

    1. 用于处理前后端的数据认证(显示错误信息)
    2. 用于生成HTML代码
    3. 处理form表单提交过来的数据
    4. 初始化客户端显示的内容

    二、Form的实现方式

    创建Form对象:

    from django import forms
    from django.forms import fields
    
    #创建类,继承Form
    class StudentMessage(forms.Form):
        #创建字段
        name=fields.CharField(
            max_length=8,
            min_length=3,
            required=None,)
        age=fields.IntegerField(max_value=99,min_value=18)
        email=fields.EmailField()
        

    Form的简单使用:

    def add_student(request):
        if request.method=="GET":
            obj = StudentMessage()  #生成一个Form对象,并传入前端
            return render(request,"add_student.html",{"obj":obj})
    
        elif request.method=="POST":
            #这里再创建对象,这次是用来验证传输过来的数据
            obj = StudentMessage(request.POST)
            if obj.is_valid():  #验证数据
                print(obj.cleaned_data) #获取前端传过来的数据
                StudentInfo.objects.create(**obj.cleaned_data)
                return redirect("/show_student")
            else:
                return render(request,"add_student.html",{"obj":obj})

    Form的前端处理:

    <form action="/add_student/" method="post">
        <p>{{ obj.name }}{{ obj.errors.name.0 }}</p>  #{{ obj.name }}渲染的时候就会自动生成input的框
        <p>{{ obj.age }}{{ obj.errors.age.0 }}</p>
        <p>{{ obj.email }}{{ obj.errors.age.0 }}</p>
        <input type="submit" value="提交">
    </form>

    以上就是一个简单的使用流程。

    三、验证功能详解

    def edit_student(request,nid):
        if request.method == "GET":   #处理get请求时的处理方式
            student_data = StudentInfo.objects.filter(id=nid).first() #获取数据库的数据
            obj = StudentMessage({"name":student_data.name,"age":student_data.age,"email":student_data.email})  #将数据库的数据作为input的默认值,或是在编辑时候的值
            return render(request,"edit_student.html",{"obj":obj,
                                                       "nid":nid})
        elif request.method == "POST": #处理post请求时的处理流程
            obj = StudentMessage(request.POST)
            if obj.is_valid():  #这里就会对数据处理,但是这里仅处理数据的格式等问题,如果格式没有什么问题就会举行执行
                StudentInfo.objects.filter(id=nid).update(**obj.cleaned_data)
                return redirect("/show_student")
            else: #如果格式有误就执行这个代码,这时obj里面就有错误是信息
                return render(request,"edit_student.html",{"obj":obj})

    四、Form的内置的常用的字段

    CharField(Field)  #对字符串进行格式验证
        max_length=None,             最大长度
        min_length=None,             最小长度
        strip=True                   是否移除用户输入空白
    
    IntegerField(Field)  #对整数进行认证
        max_value=None,              最大值
        min_value=None,              最小值
    
    #对时间日期等格式进行认证
    DateField(BaseTemporalField)    格式:2015-09-01
    TimeField(BaseTemporalField)    格式:11:12
    DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
    
    #对邮箱的数据类型进行认证
    EmailField(CharField) 
    
    #对文件类型进行
    FileField(Field)
        allow_empty_file=False     是否允许空文件
    
    #用于扩展
    ChoiceField(Field)
        ...
        choices=(),                 选项,如:choices = ((0,'上海'),(1,'北京'),)
        required=True,           是否必填
        widget=None,            插件,默认select插件
        label=None,               Label内容
        initial=None,              初始值
        help_text='',              帮助提示
    
    #用于扩展
    ModelChoiceField(ChoiceField)
        ...                        django.forms.models.ModelChoiceField
        queryset,                  # 查询数据库中的数据
        empty_label="---------",   # 默认空显示内容
        to_field_name=None,        # HTML中value的值对应的字段
        limit_choices_to=None      # ModelForm中对queryset二次筛选
    #对IP地址进行认证
    GenericIPAddressField
        protocol='both',           both,ipv4,ipv6支持的IP格式
        unpack_ipv4=False          解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1, PS:protocol必须为both才能启用

    四、form的其他插件

      前面的常用的字段类型生成的都是input的标签,form的其他组件就可以生成其他不同类型的form表单内的标签。

    # 通过widget属性的改变来更改标签的生成类型
    # initial 属性是默认选择的意思

    # 但radio,接收的值为字符串 #
    user = fields.CharField( # initial=2, #默认选择中 # widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),)) # ) # 单radio,值为字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.RadioSelect # ) # 单select,值为字符串 # user = fields.CharField( # initial=2, # widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) # ) # 单select,值为字符串 # user = fields.ChoiceField( # choices=((1, '上海'), (2, '北京'),), # initial=2, # widget=widgets.Select # )

    # 多选的必须有MultipleChoiceField创建 # 多选select,值为列表 # user = fields.MultipleChoiceField( # choices=((1,'上海'),(2,'北京'),), # initial=[1,], # widget=widgets.SelectMultiple # ) # 单checkbox # user = fields.CharField( # widget=widgets.CheckboxInput() # ) # 多选checkbox,值为列表 # user = fields.MultipleChoiceField( # initial=[2, ], # choices=((1, '上海'), (2, '北京'),), # widget=widgets.CheckboxSelectMultiple # )

    注意:在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。

    from django.forms import Form
    from django.forms import widgets
    from django.forms import fields
    from django.core.validators import RegexValidator
     
    class MyForm(Form):
     
        user = fields.ChoiceField(
            # choices=((1, '上海'), (2, '北京'),),
            initial=2,
            widget=widgets.Select
        )
     
        def __init__(self, *args, **kwargs):
            super(MyForm,self).__init__(*args, **kwargs)
            # self.fields['user'].widget.choices = ((1, '上海'), (2, '北京'),)
            # 实施更新数据库的方式
            self.fields['user'].widget.choices = models.Classes.objects.all().value_list('id','caption')

    五、关于Form组件的扩展

    扩展form中的正则表达式的验证:

    class EasyForm(forms.Form):
        '''
        方式一:
        1、使用 validators字段
        2、字段右边是一个列表
        3、列表的每个元素是一个正则的匹配方法
        4、列表的每个元素是RegexValidator的实例
        5、RegexValidator的实例化需要两个参数,一个是正则表达式,一个是匹配错误时的错误信息
        '''
        phone = fields.CharField(
            validators=[RegexValidator(r'^[0-9]+$',"请输入数字"),RegexValidator(r'^159[0-9]+&',"数字必须是159开头")],
        )
    自定义Form的方式扩展,验证方式,基于源码的方式
    class OutoForm(forms.Form):
        name = fields.CharField(max_length=20)
        def clean_name(self):
            v = self.cleaned_data["name"]
            if StudentInfo.objects.filter(name=v).count():  #这里可以对用户名存在认证,
                raise ValidationError("用户名已存在")
            return v
    '''
    通过源码扩展:
    1、写方法名clean_字段名的形式:这里有需要再判断的name字段,所以方法名为:clean_name
    2、必须要有返回值,如果是没有错的数据,返回值必须为self.cleaned_data['字段名']
    3、必须继承ValidationError异常类
    4、如果数据有误,必须抛出异常
    5、异常的参数可以填写,这个参数会是一个错误信息
    6、短板:仅可以在当前字段进行操作,多字段时无效
    '''

    对多字段时的扩展

    class AjaxForm(forms.Form):
        username = fields.CharField()
        user_id = fields.IntegerField(
            widget=widgets.Select(choices=[(0, 'alex'), (1, '刘皓宸'), (2, '杨建'), ])
        )
    
        # 自定义方法 clean_字段名
        # 必须返回值self.cleaned_data['username']
        # 如果出错:raise ValidationError('用户名已存在')def clean(self):
            value_dict = self.cleaned_data
            v1 = value_dict.get('username')
            v2 = value_dict.get('user_id')
            if v1 == 'root' and v2 == 1:
                raise ValidationError('整体错误信息')
            return self.cleaned_data
  • 相关阅读:
    JAVA数据库连接池
    数据库连接池总结 Proxool
    Linux下挂载ISO文件
    Runtime.getRuntime().addShutdownHook()的使用
    tomcat original passports setting
    JDBC之通过DatabaseMetaData对象了解数据库的信息
    linux下mysql远程登陆
    教您如何安全的应用 MySQL
    Eclipse中cvs的使用介绍
    WM_COPYDATA
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/9271507.html
Copyright © 2011-2022 走看看