2020.5.9 forms and Paginator对象

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


Table of Contents


用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.今天都复习了之前的什么内容