昨日回顾:
   批量插入数据:
      -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. 小程序 js中获取时间new date()的用法(网络复制过来自用)

    js中获取时间new date()的用法   获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获 ...

  2. 【代码笔记】iOS-JSONKit的使用

    一,工程图. 二,代码. #import "RootViewController.h" //为JSONKit添加头文件 #import "JSONKit.h" ...

  3. OSGI企业应用开发(五)使用Blueprint整合Spring框架(二)

    上篇文章中,我们开发了一个自定义的Bundle,接着从网络中下载到Spring和Blueprint的Bundle,然后复制到DynamicRuntime项目下. 需要注意的是,这些Bundle并不能在 ...

  4. kafka-hadoop-consumer

    写了一个工具,从kafka传输数据到hdfs,采用的api,可以消费指定的kafka topic 或者为了简便可以消费所有的topic中各个partition的数据. 地址:https://githu ...

  5. 用php和ajax写一个省市区的三级联动,实现地区的下拉选择

    要实现这个页面的三级联动,我们需要建立三个php文件,第一个php文件我们导入jQuery文件,里面嵌入JavaScript:第二个php文件我们做一个php的处理页面,里面引入我们封装好的数据库类文 ...

  6. 更多内容 - 请关注我的 CSDN 博客

    欢迎关注我的 CSDN 博客 因为粉丝多数是在 CSDN 上,所以更多内容放在了 我的 CSDN 博客: [点击跳转] 地址:https://icode.blog.csdn.net

  7. openCV 视频分解及合成

    1. 视频分解 import cv2 # ************************** # 分解视频 cap=cv2.VideoCapture('1.mp4')#获取一个视频cap isOpe ...

  8. react native中的聊天气泡以及timer封装成的发送验证码倒计时

    今天看来情书写的文章,研究了一下大佬写的文章,自己做一点总结. 其实,今天我想把我近期遇到的坑都总结一下:1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以 ...

  9. [Android] 实现简单的相机程序

    好久没写了,有些东西做过都快忘了,赶紧记一下. 现在来实现一个简单的相机程序. 原文地址http://www.cnblogs.com/rossoneri/p/4246134.html 当然需要的话可以 ...

  10. UWP开发细节记录:WRL::ComPtr 的坑

    WRL::ComPtr 取原始指针的地址有两种方式: operator&()   先释放原指针再取地址 GetAddressOf() 直接得到原始指针的地址 显然,operator& ...