• Django之Form进阶


    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个 分开  之间用一个
      
    今日内容:
     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
       - 权限管理***

  • 相关阅读:
    C++ Builder XE2随意学习 (5) > 我的学习路线
    麻省理工公开课:电路和电子学 (2) > 基本电路分析法
    C++ Builder XE2随意学习 (4) > Delphi XE2官方视频教程31天
    日志收集系统elk
    mysql笔记第一天: 介绍和MySQL编译安装
    rsync服务搭建2018.5.8 [优化后最终版]
    docker基础使用和资源限制
    zabbix第一天 zabbix安装,添加监控项
    你好,测试markdown
    LVM扩容案例
  • 原文地址:https://www.cnblogs.com/1a2a/p/7796026.html
Copyright © 2020-2023  润新知