zoukankan      html  css  js  c++  java
  • Django 三—— Form组件

    内容概要:

    1.Django Form如何自定义验证字段

    2.Django Form如何动态的显示数据库中新插入的数据

    3.Tyrion


    Django的Form(用于验证用户请求合法性的一个组件)

    Django的Form主要具有一下几大功能:

    • 生成HTML标签
    • 验证用户数据(显示错误信息),判断字段类型、长度、格式是否正确
    • 保留页面信息
    • 设置页面显示的初始化内容

    1.如何自定义验证字段

    自定制验证:

    • 单一字段  def clean_字段名(self):
    • 组合字段  def _post_clean(self):
    • 组合字段  def clean(self):

     forms.py中

    #专门建forms.py文件,用于放各个模块的字段
    from django import forms
    from django.core.exceptions import ValidationError
    from django.forms import fields
    
    
    class UserForm(forms.Form):
        # username = forms.CharField(max_length=32)  forms.或者fields.都可以
        username = fields.CharField(max_length=32,label='用户名')
        email = fields.EmailField(label='邮箱')
    
        '''
        # 自定义验证规则方法一: 可以自定义方法来验证 单个字段 在错误信息级别进行详细的定制,但是它实际最基础的验证还是已经在forms.Form中已经完成:
        # forms模块内部有   clean_字段名()  方法,所以可以这样自定义验证:
        def clean_username(self):
            value = self.cleaned_data['username']
            if value =='root':
                return value
            else:
                raise ValidationError('你不是管理员。。。')  #主动跑出异常让error接收,必须带参数
        '''
        '''
        #自定义验证规则方法二:可以自定义_post_clean(self)或者clean() 方法来验证 多个字段组合错误 在错误信息级别进行详细的定制使用_post_clean()
        def _post_clean(self):
            v1 = self.cleaned_data['username']
            v2 = self.cleaned_data['email']
            if v1 =='root' and v2 == 'root@live.com': #用户名或密码不匹配时会报  KeyError 错误
                pass
            else:
                self.add_error('__all__',ValidationError('用户名或邮箱错误。。。')) #仿造_clean_fields(self)函数写的
                #必须是  __all__,否则出不来
        '''
         # 自定义验证规则方法三: clean() 方法来验证 多个字段组合错误,这样重写clean()方法后,clean里面的数据就不是正确数据了,而数据在cleaned_data里面了
        def clean(self):
            v1 = self.cleaned_data['username']
            v2 = self.cleaned_data['email']
            if v1 == 'root' and v2 == 'root@live.com':  # 用户名或密码不匹配时会报  KeyError 错误
                pass
            else:
                raise ValidationError('用户名或邮箱错误!!!')
            return self.cleaned_data
    

      views文件夹 ==>fm.py中

    from django.shortcuts import render
    
    from app01 import forms  #引入forms.py模块
    def index(request):
        if request.method =='GET':
            obj = forms.UserForm()
            return render(request,'fm.html',{'obj':obj})
        elif request.method =='POST':
            obj = forms.UserForm(request.POST)
            # 以前的做法:
            if obj.is_valid():
                data = obj.clean()
                # print(data)
            else:
                print(obj.errors)
                # print(obj.cleaned_data)  自定义验证规则方法三: 改写 clean() 方法来验证 多个字段组合错误,这样重写clean()方法后,
                # clean里面的数据就不是正确数据了,而数据在cleaned_data里面了
            return render(request, 'fm.html', {'obj': obj})
    

      fm.html中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {#方式一:#}
    {#    {{ obj.username }}#}
    {#    {{ obj.email }}#}
    {#方式二:将obj里面的每一个对象简单粗暴的分别以**标签展示#}
    {#    {{ obj.as_p }}#}
    {#    {{ obj.as_ul }}#}
    {#<table>#}
    {#    {{ obj.as_table }}#}
    {#</table>#}
    <form method="post" action="/fm/">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

      urls.py中

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import fm
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^fm/', fm.index),
    ]
    

     2.如何动态的显示数据库中新插入的数据?

    定义init方法,先继承执行父类方法,再从数据库中取值

    在forms.py文件中

    '''
    专门建forms.py文件,用于放各个模块的字段
    内容概要:
    1.自定义验证规则
    2.如何实时同步数据库数据
    '''
    from django import forms
    from django.core.exceptions import ValidationError
    from django.forms import fields
    from app01 import models
    
    
    class UserForm(forms.Form):
        # username = forms.CharField(max_length=32)  forms.或者fields.都可以
        username = fields.CharField(max_length=32,label='用户名')
        email = fields.EmailField(label='邮箱')
    
        user_type = fields.ChoiceField(choices=models.UserType.objects.values_list('id', 'name'))
    
        # 例如:让其user_type数据  实时更新  的方法,定义init方法,先继承执行父类方法,再从数据库中取值:
        def __init__(self, *args, **kwargs):
            super(UserForm, self).__init__(*args, **kwargs)
            self.fields['user_type'].widget.choices = models.UserType.objects.all().values_list('id', 'name')
    

      

    form组件  补充知识:http://www.cnblogs.com/wupeiqi/articles/6144178.html

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado、Django、Flask、Bottle Web框架。

    http://www.cnblogs.com/wupeiqi/p/5938916.html

  • 相关阅读:
    C#进阶之路(五):Linq初识
    C#进阶之路(四):拉姆达
    SQL夯实基础(五):索引的数据结构
    SQL夯实基础(四):子查询及sql优化案例
    SQL夯实基础(三):聚合函数详解
    C#进阶之路(三):深拷贝和浅拷贝
    SQL夯实基础(二):连接操作中使用on与where筛选的差异
    前端面试题整理—HTML/CSS篇
    CSS盒模型
    node的优缺点及应用场景
  • 原文地址:https://www.cnblogs.com/tangtingmary/p/8046025.html
Copyright © 2011-2022 走看看