昨日回顾:
   批量插入数据:
      -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. DNS协议详解

    DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...

  2. python中numpy.r_和numpy.c_

    例子 import numpy as np a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = np.c_[a,b] print(np.r_[a,b ...

  3. 【代码笔记】iOS-字符串替换回车和换行

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  4. JSP内置对象——page对象

    观察可发现,这里面的方法,就是Object这个类下的一些方法,下面进行一个简单的演示,比如“toString()”方法: 运行结果: 这时候看到了一个“org.apache.jsp.page_jsp@ ...

  5. Sql Server Express 2005提示"failed to generate a user instance of sql server "

    解决方法: 修改连接字符串“Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\mydb.mdf;Integrated Security ...

  6. Android--自定义控件---自动分页的GridView

    最近,根据项目需求,需要一个能够自动分页的导航,所以便自定义了一个自动分页的GridView. 思路:继承RelativeLayout,然后在里面放了一个viewpager和一个GridView... ...

  7. 使用ADB无线连接Android真机进行调试

    使用ADB无线连接Android真机进行调试   其实这已经是一个很古老的知识了,记录一下备忘. 准备工作 手机和电脑需要在同一个局域网内 电脑上已经安装好ADB工具,可以是Mac或者Windows ...

  8. Expo大作战(二十一)--expo如何分离(detach),分离后可以比react native更有优势,但也失去了expo的部分优势,

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  9. LeetCode题解之Contains Duplicate II

    1.题目描述 2.题目分析 使用哈希表 和分情况讨论的方法 3.代码 bool containsNearbyDuplicate(vector<int>& nums, int k) ...

  10. MySQL crash-safe replication(2):

    MySQL数据库的成功离不开其replicaiton(复制),相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册 ...