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')
-渲染模板
{#方式一#}
<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的更多相关文章
- python 全栈开发,Day77(图书管理系统)
一.图书管理系统 完整代码链接: https://github.com/py3study/bms_multi 本项目使用session来实现一个简单的图书管理系统 未登录不允许访问后台: 直接访问后台 ...
- day77 作业
目录 一.完成todolist案例 二.商品页面 一.完成todolist案例 <!DOCTYPE html> <html lang="en"> <h ...
- day77 vue对象提供的属性功能
目录 一.过滤器 二.计算属性(computed) 三.侦听属性(watch) 四.vue对象的生命周期 五.阻止事件冒泡和刷新页面 六.综合案例-todolist 一.过滤器 定义:就是vue允许开 ...
- day77:luffy:导航栏的实现&DjangoRestFramework JWT&多条件登录
目录 1.导航栏的实现 2.登录前戏:用户表初始化 3.DjangoRestFramework JWT 4.多条件登录 5.登录状态的判断和退出登录 1.导航栏的实现 1.设计导航栏的model模型类 ...
- ORM表操作
1.在python脚本中调用django环境 在根文件夹下,创建test.py文件 import os if __name__ == '__main__': os.environ.setdefault ...
- Python面向对象之方法
普通方法要执行类里面的方法是通过对象触发的 触发的时候把自己赋值给self 类方法 vim day7-7.py #!/usr/bin/python # -*- coding:utf-8 -*- cla ...
- day 77 基于form组件的注册功能
Form 表单 py文件 from django import forms #定义一个form类注册用 class RegForm (forms.Form): username =forms.Char ...
- day 75天 bbs 项目第一天 ,auth登陆
from django.db import models from django.contrib.auth.models import AbstractUser class UserInfo(Abst ...
- 巨蟒python全栈开发linux之centos6
1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...
随机推荐
- DNS协议详解
DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...
- 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 ...
- 【代码笔记】iOS-字符串替换回车和换行
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- JSP内置对象——page对象
观察可发现,这里面的方法,就是Object这个类下的一些方法,下面进行一个简单的演示,比如“toString()”方法: 运行结果: 这时候看到了一个“org.apache.jsp.page_jsp@ ...
- Sql Server Express 2005提示"failed to generate a user instance of sql server "
解决方法: 修改连接字符串“Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\mydb.mdf;Integrated Security ...
- Android--自定义控件---自动分页的GridView
最近,根据项目需求,需要一个能够自动分页的导航,所以便自定义了一个自动分页的GridView. 思路:继承RelativeLayout,然后在里面放了一个viewpager和一个GridView... ...
- 使用ADB无线连接Android真机进行调试
使用ADB无线连接Android真机进行调试 其实这已经是一个很古老的知识了,记录一下备忘. 准备工作 手机和电脑需要在同一个局域网内 电脑上已经安装好ADB工具,可以是Mac或者Windows ...
- Expo大作战(二十一)--expo如何分离(detach),分离后可以比react native更有优势,但也失去了expo的部分优势,
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- LeetCode题解之Contains Duplicate II
1.题目描述 2.题目分析 使用哈希表 和分情况讨论的方法 3.代码 bool containsNearbyDuplicate(vector<int>& nums, int k) ...
- MySQL crash-safe replication(2):
MySQL数据库的成功离不开其replicaiton(复制),相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册 ...