昨日回顾:
   批量插入数据:
      -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 formData图片上传(单图上传、多图上传)后台java

    单图上传 <div class="imgUp">     <label>头像单图</label>     <input type=&quo ...

  2. PHP中NOTICE错误常见解决方法

    对于初学者,肯定会遇到不同的错误提示,比如:警告,致命,等等,其中NOTICE错误等级最低,页面中,好多类似 Notice: Use of undefined constant title - ass ...

  3. 设计模式(9)--Composite(组合模式)--结构型

    1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...

  4. jquery判断浏览器的内核

    <script type='text/javascript'> $(function(){ if($.browser.msie) { alert("IE浏览器"); } ...

  5. Lambda表达式 For Android

    Lambda简介 A lambda expression is a block of code with parameters. lambda表达式是带参数的代码块. 虽然看着很先进,其实Lambda ...

  6. 【Python】插入sqlite数据库

    import sqlite3 from datetime import datetime conn = sqlite3.connect('data.db') print("Opened da ...

  7. LeetCode题解之Largest Number

    1.题目描述 2. 将整数值转换为string  ,然后排序. 3.代码 string largestNumber(vector<int>& nums) { vector<s ...

  8. Sql Server Tempdb原理-日志机制解析实践

    笔者曾经在面试DBA时的一句”tempdb为什么比其他数据库快?”使得95%以上的应试者都一脸茫然.Tempdb作为Sqlserver的重要特征,一直以来大家对它可能即熟悉又陌生.熟悉是我们时时刻刻都 ...

  9. 转:js小技巧 ,将彻底屏蔽鼠标右键,可用于Table ,取消选取、防止复制,IE地址栏前换成自己的图标

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键<table border oncontextmenu= ...

  10. Django之url映射

    url映射的作用 根据Django的MTV模式,url的映射是根据用户输入或传送而来的url路径,来进行区分去执行相应的view函数来响应用户的操作. url映射的方式 Django项目的创建后,会自 ...