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. vue-cli 跳转方式

    一:router-link标签跳转 <router-link to='/citylist'><div class="header-right">城市< ...

  2. HashMap中ConcurrentModificationException异常解读

    HashMap是一个线程不安全的集合,如果在遍历的过程中同时对该集合进行修改操作,例如put,add,remove等,会抛出java.util.ConcurrentModificationExcept ...

  3. webpack4打包报错:WARNING in configuration The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults fo

    运行命令webpack ./src/main.js ./dist/murenziwei.js后,目录上神马动静都没有,你以为在dist文件夹上会有murenziwei.js吗?毛都没有 警告和错误倒是 ...

  4. 将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)

    网上翻了几百篇博客,看了半天,要不就是写的乱七八糟看不懂,要不就是隐藏了一些细节,要不就是实现不了,最后还是在Android官网上看明白了,而且说得有条有理,以后遇到不懂的一定要先翻官网. 参考资料: ...

  5. [CF718C] Sasha and Array

    Description 给定一个数列,维护两种操作 操作 \(1\),将区间 \([l,r]\) 的数字统一加 \(x\). 操作 \(2\),求 \(\sum \limits_{i=l}^r f(v ...

  6. c#连接访问数据库(菜鸡篇)

    C#如何访问数据库(小白篇) 刚入坑不久学习的路上还是遇到了不小的问题,昨天学习C#的时候需要连接数据库获取数据. 网上有很多这样的文章,说实话对于我这样的小白还真是有点难理解,经过一番周折总算是了解 ...

  7. [日常] Go语言圣经-字节切片与字符串

    1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...

  8. Matlab 输入特殊字符

    下标用 _(下划线)  希腊字母等特殊字符用 \加拼音 如  α \alpha  β \beta  γ \gamma  θ \theta  Θ \Theta  Г \Gamma  δ \delta  ...

  9. JS实现页面分享代码share,不需要第三方接口

    在开发一个页面的时候常常会有这么一个小功能,就是分享该页面中的信息. 常见的分享代码有百度分享,JiaThis分享插件(现在貌似不能用了),bshare分享插件等,我主要分享一下自定义分享代码,如下: ...

  10. ionic3 细节注意

    一.图标和splash大小不一样 icon图标的大小尽量为1024*1024,并且不能为圆角. splash图片的大小尽量为2732*2732,ionic1的大小为2208*2208