昨日回顾:
   批量插入数据:
      -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')

-渲染模板

{#方式一#}
<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 }}
  -渲染错误信息
     - 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

-全局钩子
     #重写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('两次密码不一致')

day77的更多相关文章

  1. python 全栈开发,Day77(图书管理系统)

    一.图书管理系统 完整代码链接: https://github.com/py3study/bms_multi 本项目使用session来实现一个简单的图书管理系统 未登录不允许访问后台: 直接访问后台 ...

  2. day77 作业

    目录 一.完成todolist案例 二.商品页面 一.完成todolist案例 <!DOCTYPE html> <html lang="en"> <h ...

  3. day77 vue对象提供的属性功能

    目录 一.过滤器 二.计算属性(computed) 三.侦听属性(watch) 四.vue对象的生命周期 五.阻止事件冒泡和刷新页面 六.综合案例-todolist 一.过滤器 定义:就是vue允许开 ...

  4. day77:luffy:导航栏的实现&DjangoRestFramework JWT&多条件登录

    目录 1.导航栏的实现 2.登录前戏:用户表初始化 3.DjangoRestFramework JWT 4.多条件登录 5.登录状态的判断和退出登录 1.导航栏的实现 1.设计导航栏的model模型类 ...

  5. ORM表操作

    1.在python脚本中调用django环境 在根文件夹下,创建test.py文件 import os if __name__ == '__main__': os.environ.setdefault ...

  6. Python面向对象之方法

    普通方法要执行类里面的方法是通过对象触发的 触发的时候把自己赋值给self 类方法 vim day7-7.py #!/usr/bin/python # -*- coding:utf-8 -*- cla ...

  7. day 77 基于form组件的注册功能

    Form 表单 py文件 from django import forms #定义一个form类注册用 class RegForm (forms.Form): username =forms.Char ...

  8. day 75天 bbs 项目第一天 ,auth登陆

    from django.db import models from django.contrib.auth.models import AbstractUser class UserInfo(Abst ...

  9. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

随机推荐

  1. IO流作业

    IO流作业 一.    填空题 Java IO流可以分为    字节流          和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道 ...

  2. ThinkPHP5下自己写日志

    1.首先在common.php公共函数文件下写需要的公共函数(appalication/common.php文件下),在此文件下写的函数可以在项目任意页面直接调用 /** * 打印log日志 * @p ...

  3. javax.net.ssl.SSLHandshakeException sun.security.validator.ValidatorException PK

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...

  4. apache2.2 +php7.3安装 编译安装

    1.下载 http://archive.apache.org/dist/httpd/httpd-2.2.0.tar.gz tar -xvf httpd-2.2.0.tar.gz 2.安装 ./conf ...

  5. PHP-隐藏手机号中间四位

    substr_replace('手机号', '****', 3, 4);

  6. Intellij IDEA去除@Autowired下划线红色提示

    Intellij IDEA通过@Autowired注入的对象,在不改变配置的情况下一直有红色下划线,虽然不影响运行,但是跟小Alan一样有强迫症的肯定受不鸟. 那么怎么去除它呢? 解决方式:改变@Au ...

  7. Bootstrap源码分析系列之初始化和依赖项

    在上一节中我们介绍了Bootstrap整体架构,本节我们将介绍Bootstrap框架第二部分初始化及依赖项,这部分内容位于源码的第8~885行,打开源码这部分内容似乎也不是很难理解.但是请站在一个开发 ...

  8. GIT回推本地commit近期版本

    一次意外吧,本地add并且commit之后拉了别人错误的代码下来,后来本地又需要进行编写测试,无奈只能回推到自己刚刚commit过的代码,但是git命令除了拉去提交等其他的不是很熟悉,在度娘之后也遇到 ...

  9. AForge.NET简介

    AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器 ...

  10. continue break exit用法说明

    1,continue用法 2,break用法 3,sys.exit用法 1,continue用法(跳出本次循环,继续下次循环) for i in xrange(10): if i == 8: cont ...