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学习 (十六)————JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  2. .net网站上传图片换电脑不显示

    当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可.

  3. 还需要注册的是我们还有一个是“交差集” cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积。表达式如下:

             还需要注册的是我们还有一个是"交差集" cross join, 这种Join没有办法用文式图表示,因为其就是把表A和表B的数据进行一个N*M的组合,即笛卡尔积.表 ...

  4. git+github/码云+VSCode (转载)

    VSCode中使用git,参见. Git安装   在初次使用时如果本地没有安装git会提示先安装git,然后重启vscode. 一.本地操作项目前提: 1)若本地没有git拉取下来的项目,用git克隆 ...

  5. JAVA 的输入与输出流当中,什么时候该使用字符流?什么时候该使用字节流?

    1. InputStream 和OutputStream,两个是为字节流设计的,主要用来处理字节或二进制对象, 2. Reader和 Writer.两个是为字符流(一个字符占两个字节)设计的,主要用来 ...

  6. 4.移植uboot-使uboot支持DM9000网卡

    在上一章,使uboot能够支持nor.nand 本节继续修改让uboot支持DM9000C网卡,便可以通过网络来传输文件 首先uboot已带有dm9000网卡的驱动,位于drivers/net/下的d ...

  7. 【Java基础】12、java中方法的参数传递机制

    问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个 ...

  8. 虚拟机安装Linux Centos

    1.准备工作: Linux系统: 可以去 https://www.centos.org/download/ 下载DVD ISO版 虚拟机 2.VMware配置 3.Linux系统安装 4.重启,安装成 ...

  9. Python 练习:使用 # 号输出长方形

    使用 # 号输出一个长方形,用户可以指定宽和高 height = int(input("please input height: "))width = int(input(&quo ...

  10. csharp: sum columns or rows in a dataTable

    DataTable dt = setData(); // Sum rows. //foreach (DataRow row in dt.Rows) //{ // int rowTotal = 0; / ...