day77

昨日回顾:
   批量插入数据:
      -queryset的方法:bulk_create(对象列表,数字(一次插入多少))
   分页器:
      from django.core.paginator import Paginator
        book_list=models.Book.objeces.all()
        pageinator=Paginator(book_list,10)
        pageinator.cout
        pageinator.num_pages
        pageinator.page_range
        #生成当前页码对象
        current_page=pageinator.page(当前页)
        current_page.object_list
        current_page.has_next()
        current_page.has_pervious()
        上一页页码数
        下一页页码数
  
    前端:
       -模板语言for循环,输出所有页码数
        -总页码数不够11,有多少,就输出多少
        -总页码数大于11,
         -当前页码数<6:page_range=range(1,12)
         -当前页码+5>总页码数:page_range=range(pageinator.num_pages-10,pageinator.num_pages+1)
         -其他情况:page_range=range(current_page_num-5,current_page_num+6)
       -点中页码跳转
        -'?page=13'
        -'/index/?page=13'----->路径不要忘掉前面的斜杠
  
今日内容
   forms组件
      -forms是什么?
         就是一个类,可以校验字段(前台传过来的字段)
      -怎么用:
        -校验字段功能:
         -先写一个类,继承Form
         from django.shortcuts import render, HttpResponse
         from django import forms
         # 写一个类,要校验那些字段,就是类的属性
         class MyForm(forms.Form):
          # 定义一个属性,可以用来校验字符串类型
          # 限制最大长度是8,最小长度是3
          name=forms.CharField(max_length=8,min_length=3)
          pwd=forms.CharField(max_length=8,min_length=3,required=True)
          # 校验是否是邮箱格式
          email=forms.EmailField()
       -使用:
# 校验字段功能
def index(request):
    if request.method == 'GET':
        return render(request, 'index.html')
    elif request.method == 'POST':
        # print(request.POST)
        form = User(request.POST)
        if form.is_valid():
            # 校验正确的数据
            print(form.cleaned_data)
        else:
            # 校验正确的数据
            print(form.cleaned_data)
            # 校验错误的字段:"错误的信息"
            print(form.errors)
            # 错误的信息
            print(form.errors.get('name'))
        return HttpResponse('OJBK')
View Code
  -渲染模板
{#方式一#}
<form action="" method="post" novalidate>
    <p>{{ form.name.label }}{{ form.name }}</p>
    <p style="color: red">{{ form.name.errors.0 }}</p>
    <p>{{ form.pwd.label }}{{ form.pwd }}</p>
    <p style="color: red">{{ form.pwd.errors.0 }}</p>
    <p>{{ form.email.label }}{{ form.email }}</p>
    <p style="color: red">{{ form.email.errors.0 }}</p>
    <input type="submit" id="btn" value="登陆">
</form>
{#方式二#}
<form action="" method="post" novalidate>
    {% for foo in form %}
        <p>{{ foo.label }}{{ foo }}</p>
    {% endfor %}
</form>
{#方式三#}
<form action="" method="post" novalidate>
    {{ form.as_p }}
View Code
  -渲染错误信息
     - myforms有errors
     -属性(name)也有errors
     -错误信息,变成中文:
      - error_messages={'max_length': '最长是8', 'min_length': '最短是3', 'required': '这个必须填','invalid': '不符合邮箱格式'}
     -给input标签指定样式,指定格式:
       -widget=widgets.TextInput(attrs={'class':'form-control'})
     -模板,渲染错误信息:<span>{{ myform.name.errors.0 }}</span>
  -局部钩子校验
     -定义一个函数,名字叫:clean_字段名字,内部,取出该字段,进行校验,如果通过,将该字段返回,如果失败,抛异常(ValidationError)
     -   def clean_name(self):
       # self:当前form对象
         name = self.cleaned_data.get('name')
         if name.startswith('sb'):
            # 失败,抛异常
            raise ValidationError('不能以sb开头')
         # 正常,把name返回
         return name
    def clean_name(self):
        name = self.cleaned_data.get('name')
        res = models.User.objects.filter(name=name)
        if res:
            raise ValidationError('用户名重复')
        return name
View Code
  -全局钩子
     #重写clean方法
       def clean(self):
          #程序能走到该函数,前面校验已经通过了,所以可以从cleaned_data中取出密码和确认密码  
          pwd=self.cleaned_data.get('pwd')
          re_pwd=self.cleaned_data.get('re_pwd')
          #进行自己的校验
          if pwd==re_pwd:
             #通过,直接返回cleaned_data
             return self.cleaned_data
          else:
             #失败,抛异常(ValidationError)
             raise ValidationError('两次密码不一致')
    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')
        if pwd == re_pwd:
            return self.cleaned_data
        else:
            raise ValidationError('两次密码不一致')
View Code

相关推荐