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. JavaWeb学习(二十二)———EL表达式

    一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...

  2. SpringBoot JPA + H2增删改查示例

    下面的例子是基于SpringBoot JPA以及H2数据库来实现的,下面就开始搭建项目吧. 首先看下项目的整体结构: 具体操作步骤: 打开IDEA,创建一个新的Spring Initializr项目, ...

  3. LINQ 【高级查询】

    using (Data0216DataContext con = new Data0216DataContext()) {      List<Users> ulist = con.Use ...

  4. Java开发中json使用,各对象与json相互转换

    Json:一种网络通信使用的数据格式,因为便于解析,比较流行,对象可以转为json,同样json也可以转对象. 下面介绍下Json工具的简单使用(fastjson && jackson ...

  5. 性能监控(5)–JAVA下的jstat命令

    jstat的基本语法为 Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [& ...

  6. Ubuntu(14.04LTS)学习札记

    这篇博文是我在基于Ubuntu学习一些知识的札记,方便日后进行不断回顾,这里进行统一记录,当然当学到新的东西也会陆续更新!!!还请各位博主不要见笑,小弟在此谢过~\(≧▽≦)/~啦啦啦!!!! 1.U ...

  7. LoadRunner接口测试标准模板

    Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_para ...

  8. 通过AccessKey调用阿里云CDN接口刷新CDN资源案例

    通过AccessKey远程调用阿里云CDN接口,快速实现自动化集成部署. CdnService.java package com.nfky.cdn; import com.aliyuncs.Defau ...

  9. echarts环形图,自定义说明文字

    一.代码 app.title = '已安装通讯盒电站统计'; option = { backgroundColor: '#0f0f31',//#0f0f31 title: { show:true, x ...

  10. 【读书笔记】iOS-微定位技术

    在大型商场,医院或是大楼里,你是否曾经有过找不到想去的地方的经历呢?这种情况下采用传统的定位方法就有些力不从心了.首先这些地方不能采用GPS定们,而Wifi和蜂窝式移动电话基站定位误差比较大.这种情况 ...