2020.5.9 forms and Paginator对象

发布于 2020-05-09  17 次阅读


1.复习内容

  • 正则表达式的match对象的属性方法

    • 属性变量
      • pos 匹配开始位置 ,
      • endpos 匹配结束位置
      • re 正则表达式,string目标字符串,
      • lastgroup最后一组名称,lastindex最后一组序号
    • 属性方法
      • span()匹配起始位置
      • start()匹配开始位置,
      • end()匹配结束位置
      • groupdict()捕获组字典(组名:值)
      • groups()子组对应内容,就是小括号里面的内容,返回一个元组,
      • group(n=0),获取整个匹配对象,还可以是序列号或者组名,来获取子组的内容
      • end是结束位置,默认为字符串长度
  • 正则表达式常用函数总结

    • 返回一个值(返回match对象)
      • match(), #从开始处匹配*
      • search(), #随意匹配
      • fullmatch() # 字符串和匹配必须相同
    • 返回多个值
      • findall() 返回一个列表
      • finditer() #返回迭代器
    • 分割函数
      • split(pattern,string,maxsplit,flags)
        用pattern分割string,maxsplit是最大分割次数,flags是常量
        替换
      • sub(pattern,replace,string,count,flags)与subn(pattern,replace,string,count,flags)
        • 用replace替换stirng中被匹配的内容,count是最多次数,replace可以是一个函数
    • 编译
      • complex()
    • 其他
      • escape(pattern) 转义正则表达式中具有特殊含义的字符
      • re.purge() 清除正则表达式缓存

2.灵感代办

  • python 多对多操作

    • author.book_set.all()
    • author.book_set.filter()
    • author.book_set.create(...) # 创建新书并联作用author
    • author.book_set.add(book) # 添加已有的书为当前作者author
    • author.book_set.clear() # 删除author所有并联的书
    • author.book_set.remove() # 删除所author所有并联的书
  • session_id

    • 在使用session时候,浏览器会自动生成
  • django 聚合函数使用 aggregate ,annotate

  • python 中的正则使用

  • 会话

  • django APP应用自己的模板

3.学习内容

  • django 中间件 middleware

    • 什么是中间件?

      • 类似一个钩子,在请求响应之前做一些操作。
      • 一个中间件会实现特定的功能,比如crsf可以简单防止跨域攻击
    • 创建自定义中间件

      • 1.继承MiddlewareMixin类(django.utils.deprecation包中)

      • 2.选定一个多个方法来实现功能

        • def process_request(self, request):
          • 执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
        • def process_view(self, request, callback, callback_args,callback_kwargs):
          • 调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
        • def process_response(self, request, response):
          • 所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
        • def process_exception(self, request, exception):
          • 当处理过程中抛出异常时调用,返回一个HttpResponse对象
        • def process_template_response(self, request, response):
          • 在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
        • 注: 中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponese对象时表示此请求结果,直接返回给客户端
      • 3.在setting中添加中间件的位置
      • 4.详细 https://segmentfault.com/a/1190000019992887
    • 跨站请求伪造保护 CSRF

      • 跨站请求伪造攻击

        • 不是自己的网站,要登录自己的网站做操作
      • CSRF

        • Cross-Site Request Forgey
          跨 站点 请求 伪装
      • django中默认带了简单的中间件来防护

        • django.middleware.csrf.CsrfViewMiddleware
        • 在视图处理中添加装饰器 @csrf_protect
        • 在form表单中添加{% csrf_token %}
  • Django forms模块

    • 作用:类似模型,用来创建一个form表单,可以方便验证表单的数据(通过对象创建form表单)
    • 使用:

      • 1.导入 from django import forms

      • 2.创建一个类,继承(forms.From),

      • 3.一个类属性就是一个控件(和模型很相似)

        • forms.CharField() : 文本框
        • forms.ChoiceField() : 下拉选项框
        • 可以传递的参数
          • label
            控件前的文本
          • widget
            指定小部件
          • initial
            控件的初始值(主要针对文本框类型)
          • required
            是否为必填项,值为(True/False)
      • 4.在创建的类中,可以验证数据

      • 5.在view中创建自定义的form对象,名字为form,传递给html,html中需要{% form.as_p %}

        • 可以接收表单数据
          • form = XXXForm(request.POST)
        • 验证数据是否通过
          • form.is_valid()
            返回True:通过验证,可以取值
        • 接收数据需要使用
          • 通过 form.cleaned_data 字典的属性接收数据
            form.cleaned_data : dict 类型
      • 6.使用测试

    • 注意:提交按钮需要在html中手动写

    • 解析方式:

      • 1.手动解析 {% for field in form %}XXX{% endfor %}

        • field : 表示的是form对象中的每个属性(控件)
        • {{field.label}} :表示的是label参数值
        • {{field}} : 表示的就是控件
        • 注意:属性等需要自己读取,field就是一个对象
      • 2.自动解析

        1. {{form.as_p}}
        • form中的内容都被p包裹
        • {{form.as_ul}}
          1. ul 或 ol都是自己在html中创建的
        • {{form.as_table}}
          1. table等创建也需要手动
    • widget小部件

      • 1.什么是小部件
        1. 表示的是生成到网页上的控件以及一些其他的html属性
      • 2.常用的小部件
        1. TextInput type='text'
        2. PasswordInput type='password'
        3. NumberInput type="number"
        4. EmailInput type="email"
        5. URLInput type="url"
        6. HiddenInput type="hidden"
        7. CheckboxInput type="checkbox"
        8. CheckboxSelectMultiple type="checkbox"
        9. RadioSelect type="radio"
        10. Textarea textarea标记
        11. Select select标记
        12. SelectMultiple select multiple 标记
    • 小部件的使用方法:
      • 1.继承自forms.From
        • 1.基本使用
          1. password = forms.CharField(widget=forms.PasswordInput)
        • 2.高级使用(自定义属性值)
          1. password = forms.CharField(widget=forms.PasswordInput(attr={‘key’,value,…..}))
  • form表单验证

    • 当在创建有不同的多个表单需要提交的网站时,用表单验证比较方便验证的封装
    • 调用form.is_valid() 来验证表单

    • 验证步骤:

      1. 先对form.XXXField() 参数值进行验证,比如:min_length,max_length, validators=[...],如果不符合
        form.is_valid()返回False

        • 有Email类型 账户密码等等
      2. 对各自from.clean_zzz属性名(self): 方法对相应属性进行验证,如果验证失败form.is_valid()返回False
      3. form.clean(self): 对表单的整体结构进行验证,如果验证失败form.is_valid()返回False
      4. 以上验证都成功 form.is_valid()返回True
    • 验证方法:

      • validators = [验证函数1, 验证函数1]
        • 验证函数验证失败抛出forms.ValidationError
          验证成功返回None
      • def clean_xxx属性(self):
        • 验证失败必须抛出forms.ValidationError
          验证成功必须返回xxx属性的值
      • def clean(self):
        • 验证失败必须抛出forms.ValidationError
          验证成功必须返回 self.cleaned_data
  • 分页

    • 有大量数据需要展示,就用到分页
    • 分页的类位于:django/core/paginator.py中
    • Paginator对象

      • 1.生成Paginator对象(object_list,per_page)

        • object_list ,all()等查询出来的数据
        • per_page ,一页需要多少书记
        • 返回:分页对象
      • 2.Paginator属性

        • count 对象总数
        • num_pages :页面总数
        • page_range() 从1开始的range对象,用于记录当前页码
        • per_page 每页个数
      • Paginator方法

        • Paginator.page(number)
          • 传递页码数字
          • 返回的是当前页的数据
          • 不存在页码则抛出InvalidPage异常
      • Paginator异常

        • InvalidPage:当传递一个无效页码抛出
        • PageNotAnInteger() 传递页码不是数字抛出
        • EmptyPage: 传递有效值,但是页面没有对象
    • Page对象

      • 调用Paginator对象的Page()方法返回page对象
      • page对象属性
        • object_list:当前页上所有对象的列表
        • number:当前页的序号,从1开始
        • paginator:当前page对象相关的Paginator对象
      • Page对象方法
        • has_next():如果有下一页返回True
        • has_previous():如果有上一页返回True
        • has_other_pages():如果有上一页或下一页返回True
        • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
        • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
        • len():返回当前页面对象的个数
      • page对象使用:
        • Page 对象是可迭代对象,可以用 for 语句来遍历

4.扩展延伸知识

  • python包导入方法
  • python 反向解析的使用注意

    • href = ”{% url ‘反向解析的名称’ %}?page={{p}}”
    • 带引号,单引号双引号
    • ?后面的变量要在引号内
  • python 标签的使用

    • 字典和对象的方法,也都是用.来调用
  • python forms讲解

5.知识内容个人梳理

6.今天都复习了之前的什么内容


Ares个人进阶之路