s6day76

内容回顾:
 Form组件:
  - 类  继承Form
  - 字段  字段
  - 实例化
  - is_valid()
  - cleaned_data
  - errors
 Form 组件:
  class TeacherForm(Form):
     username = fields.CharField(
        required=True,
        error_messages={'required':'用户名不能为空'},
        widget=widgets.TextInput(attrs={'placeholder':'用户名','class':'form-control'})
     ) # 不能为空
     password = fields.CharField(required=True,error_messages={'required':'密码不能为空'}, widget=widgets.TextInput(attrs={'placeholder':'密码','class':'form-control'})) # 不能为空
     email = fields.EmailField(required=True,error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'},widget=widgets.EmailInput(attrs={'placeholder':'邮箱','class':'form-control'}))   # 不能为空,且邮箱格式
    def add_teacher(request):
    if request.method == 'GET':
        form = TeacherForm()
        return render(request,'add_teacher.html',{'form':form})
    else:
        """
        1. 用户请求数据验证
        2. 自动生成错误信息
        3. 打包用户提交正确信息
        4. 错误:保留上次输入内容
        5. 定制页面上显示的HTML标签
        Django Form组件
        1. 创建规则(类,字段)
            class Foo:
                username = xxx
                password = xxx
                email = xxx
        2. 数据和规则进行匹配
        """
        form = TeacherForm(data=request.POST) # 数据和规则放置一起
        if form.is_valid():                       # 开始校验,并获取校验结果
            # print('执行成功',form.cleaned_data)          # 所有匹配成功,字典
            # {'username': 'asd', 'password': 'sdf', 'email': 'sadf@live.com','ut_id':1}
            form.cleaned_data['ut_id'] = 1
            models.UserInfo.objects.create(**form.cleaned_data)
            return redirect('/teachers/')

return render(request, 'add_teacher.html',{'form':form})

Django生命周期:客户请求首先来到wsgi,接着来到路由系统在走到views视图,如果和数据库打交道就通过ORM和数据库建立链接。拿到数据后和模板一起柔和在一起在渲染发给前端,发给前端的是字符串。
 
 py2、py3字符串:
  py2:
   字符串(utf-8/gbk编码之后值)      unicode
  py3:
   bytes(utf-8/gbk编码之后值)       字符串(unicode)
 Http请求本质是:  消息头与返回体之间用2个\r\n 分开  之间用一个\r\n
  
今日内容:
 1. 班级管理
 
 2. 学生管理
 
 3. 老师管理

内容详细:
 
 1. 班级管理
     使用这种方法定义Form验证时:数据源无法更新
  class ClassForm(Form):
   caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
   # headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
   headmaster_id = fields.ChoiceField(choices=models.UserInfo.objects.filter(ut_id=2).values_list('id','username'))

def class_add(request):
   if request.method == 'GET':
    form = ClassForm()
    return render(request,'class_add.html',{'form':form})
   else:
    form = ClassForm(data=request.POST)
    if not form.is_valid():
     return render(request, 'class_add.html', {'form': form})
    models.ClassList.objects.create(**form.cleaned_data)
    return redirect('/class_list/')
 
 
  1. headmaster_id
  2. 数据源无法实施更新,重写构造方法
   方式一(推荐):
    class ClassForm(Form):
     caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
     # headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
     headmaster_id = fields.ChoiceField(choices=[])

def __init__(self,*args,**kwargs):
      super().__init__(*args,**kwargs)
      self.fields['headmaster_id'].choices = models.UserInfo.objects.filter(ut_id=2).values_list('id','username')

方式二:
   
    from django.forms.models import ModelChoiceField
    class ClassForm(Form):
     caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
     # headmaster = fields.ChoiceField(choices=[(1,'娜娜',)])
     headmaster_id = ModelChoiceField(queryset=models.UserInfo.objects.filter(ut_id=2))
  
 2. 学生管理(同上)
 
 
 3. 老师管理
 
  编辑老师:
   1. URL跳转
   2. 根据nid获取当前老师所有信息:用户名,密码,邮箱,任课所有班级
   3. form生成HTML和默认值
 
 
 4. 用户登录
  - form的字段可以定义正则表达式
   password = fields.CharField(
    required=True,
    min_length=3,
    max_length=18,
    error_messages={
     'required': '密码不能为空',
     'min_length': '密码长度不能小于3',
     'max_length': '密码长度不能大于18',
     'invalid': '密码格式错误',
    },
    validators=[RegexValidator('\d+','只能是数字') ]#定义正则表达式
   )
  - 主动向form中添加错误信息这个是用在通过了Form判断但是没有通过数据库判断
   # form.add_error('password','用户名或密码错误')
            form.add_error('password',ValidationError('用户名或密码错误'))
 
 
 
 
 5. Form扩展(钩子函数)
 
 
 6. 中间件
  Django中中间件是什么?
   - 是一个类
   
   
内容总结:
 1. Form基本使用
  - 类
  - 字段
  - is_valid
  - cleaned_data
  - errors
 2. 字段参数:
   - max_length
   - min_length
   - validators = [RegexValidator('xxx')]
  
 3. 钩子函数
  - clean_字段名
  注意:
   必须有返回值
   只能拿自己当前字段值
   raise ValidationError('xxx')
 4. 下拉框数据源实时更新
  - 重写构造方法
   __init__
    - 先执行父类构造方法
    - self.fields['xx'].choices = xxxxx
  - ModelChoiceField
  
 5. 中间件
  - 中间件是什么?是一个类
  - 返回值注意   request返回要谨慎, response有返回值,
  - 做过什么:
   - 用户登录
   - 日志记录
   - csrf
   - session
   - 权限管理***

Django之Form进阶的更多相关文章

  1. Django的Form(二)

    上一篇已经简单介绍了Django的Form,现在开始进阶操作了 ..... 创建Form类的时候,主要涉及到Form字段和Form的插件,字段用于做form验证,插件用来生成HTML DjiangoF ...

  2. 【python】-- Django ORM(进阶)

    Django ORM(进阶) 上一篇博文简述了Django ORM的单表操作,在本篇博文中主要简述Django ORM的连表操作. 一.一对多:models.ForeignKey() 应用场景:当一张 ...

  3. Django之Form与ModelForm组件

    Django之Form与ModelForm组件 1.Form介绍 Form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 O 保留上次的输入内容 普通方式手写注册功能 vi ...

  4. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  5. Django models Form model_form 关系及区别

    Django models Form model_form

  6. 【Django】--Form组件

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 例子: 1.创建Form类 from djan ...

  7. Django基础——Form&Ajax篇

    一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...

  8. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  9. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

随机推荐

  1. 如何做自己的服务监控?spring boot 1.x服务监控揭秘

    1.准备 下载可运行程序:http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/ 2.添加服务监控依赖 <d ...

  2. 异步加载CSS

    说到加载 CSS 这种事儿不是很简单吗?像这样咯: <link rel="stylesheet" href="cssfile.css"> 这不就完事 ...

  3. mysql中的游标使用

    1.游标的作用及属性 游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作:游标有下面这些属性: a.游标是只读的,也就是不能更新它: b.游标是不能滚动的,也就是只能在一个方向上进 ...

  4. Redis基础认识及常用命令使用(一)--转载

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...

  5. 【Java并发编程】6、volatile关键字解析&内存模型&并发编程中三概念

    volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...

  6. 快速排序 java详解

    1.快速排序简介: 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此 ...

  7. C#设计模式六大原则概述

    在面向对象的设计中,我们应当遵循以下六大原则,只有掌握了这些原则,才能更好的理解设计模式. 1:单一职责原则(Single Responsibility Principle 简称 :SRP) : 就一 ...

  8. AOP,过滤器,监听器,拦截器【转载】

    面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配 ...

  9. html5新特性学习笔记

    1.语义化标签兼容问题(语义化标签只支持ie8以上,不包括ie8) 解决方法一:该标签的css中加上display:block; 通过DOM的方式创建这个标签 document.createEleme ...

  10. PDF格式的“在线阅读”和“下载”

    产生背景: 一个需求,用户可在线阅读PDF,也可下载到本地.听需求来源说人家的网站上的可以做,问我们能做吗,需要这个功能,就要来了网址,看看页面. 问题:上传PDF文件后,发现访问地址在浏览器上打开, ...