Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子
内容
1 分页器基本使用
2 分页器终极用法
3 forms组件之校验字段
1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>确认密码:<input type="password" name="re_password"></p>
<p>邮箱:<input type="text" name="email"></p>
<input type="submit" value="提交">
</form>
</body>
</html>
2 后端
# forms的使用
# 第一步:定义一个类,继承
# 第二版:在类中写字段,要校验的字段,字段属性就是校验规则
# 第三步:实例化得到一个Form对象,把要校验的数据传入
# 第四步:调用register_form.is_valid()校验,校验通过就是True
# 第五步:校验通过有register_form.cleaned_data
# 第六步:校验不通过有register_form.errors
from django import forms
from app01 import models
class RegisterForm(forms.Form):
name = forms.CharField(max_length=8,min_length=3)
password = forms.CharField(max_length=8,min_length=3)
re_password = forms.CharField(max_length=8,min_length=3)
email = forms.EmailField()
def register(request):
if request.method == 'GET':
return render(request,'register.html')
else:
# 实例化得到对象,传入要校验的数据
# register_form = RegisterForm(data=request.POST)
register_form = RegisterForm(request.POST)
if register_form.is_valid():
# 校验通过,存
# 取出校验通过的数据
print('校验通过')
print(register_form.cleaned_data)
register_form.cleaned_data.pop('re_password')
models.User.objects.create(**register_form.cleaned_data)
else:
# 校验不通过
print('校验不通过')
print(register_form.errors)
return HttpResponse('ok')
4 forms组件之渲染标签
1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>自己写</h1>
<form action="" method="post">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>确认密码:<input type="password" name="re_password"></p>
<p>邮箱:<input type="text" name="email"></p>
<input type="submit" value="提交">
</form>
<hr>
<h2>通过form自动渲染一</h2>
<form action="" method="post">
<p>用户名:{{ form.name }}</p>
<p>密码:{{ form.password }}</p>
<p>确认密码:{{ form.re_password }}</p>
<p>邮箱:{{ form.email }}</p>
<input type="submit" value="提交">
</form>
<hr>
<h2>通过form自动渲染二(基本用这种)</h2>
<form action="" method="post">
{% for item in form %}
<p>{{ item.label }}:{{ item }}</p>
{% endfor %}
<input type="submit" value="提交">
</form>
<hr>
<h2>通过form自动渲染三</h2>
<form action="" method="post">
{{ form.as_p }}
{# {{ form.as_ul }}#}
<input type="submit" value="提交">
</form>
</body>
</html>
2 后端 views
from django import forms
from app01 import models
class RegisterForm(forms.Form):
name = forms.CharField(max_length=8,min_length=3,label='用户名')
password = forms.CharField(max_length=8,min_length=3,label='密码')
re_password = forms.CharField(max_length=8,min_length=3,label='确认密码')
email = forms.EmailField(label='邮箱')
def register(request):
if request.method == 'GET':
# 生成一个空form对象
register_form = RegisterForm()
return render(request,'register.html',{'form':register_form})
else:
# 实例化得到对象,传入要校验的数据
# register_form = RegisterForm(data=request.POST)
register_form = RegisterForm(request.POST)
if register_form.is_valid():
# 校验通过,存
# 取出校验通过的数据
print('校验通过')
print(register_form.cleaned_data)
register_form.cleaned_data.pop('re_password')
models.User.objects.create(**register_form.cleaned_data)
else:
# 校验不通过
print('校验不通过')
print(register_form.errors)
return HttpResponse('ok')
5 forms组件之渲染错误信息
6 forms组件参数设置
7 forms组件全局钩子,局部钩子
1 后端
# forms的使用
# 第一步:定义一个类,继承
# 第二版:在类中写字段,要校验的字段,字段属性就是校验规则
# 第三步:实例化得到一个Form对象,把要校验的数据传入
# 第四步:调用register_form.is_valid()校验,校验通过就是True
# 第五步:校验通过有register_form.cleaned_data
# 第六步:校验不通过有register_form.errors
from django import forms
from app01 import models
from django.forms import widgets
from django.core.exceptions import ValidationError
class RegisterForm(forms.Form):
name = forms.CharField(max_length=8, min_length=3, label='用户名',
error_messages={'max_length': '最大长度为8', 'min_length': '最小长度为3', 'required': '该字段必填'},
widget=widgets.TextInput(attrs={'class':'form-control'}))
password = forms.CharField(max_length=8, min_length=3, label='密码',
error_messages={'max_length': '最大长度为8', 'min_length': '最小长度为3', 'required': '该字段必填'},
widget=widgets.PasswordInput(attrs={'class':'form-control'}))
re_password = forms.CharField(max_length=8, min_length=3, label='确认密码',
error_messages={'max_length': '最大长度为8', 'min_length': '最小长度为3', 'required': '该字段必填'},
widget=widgets.PasswordInput(attrs={'class':'form-control'}))
email = forms.EmailField(label='邮箱', error_messages={'required': '该字段必填', 'invalid': '邮箱格式错误'},widget=widgets.TextInput(attrs={'class':'form-control'}))
def clean_name(self): # name字段的局部钩子
# 校验名字不能以sb开头
name = self.cleaned_data.get('name')
if name.startswith('sb'):
# 校验不通过,必须抛异常
raise ValidationError('不能以sb开头')
else: # 校验通过,返回name对应的值
return name
def clean(self): # 全局钩子
password = self.cleaned_data.get('password')
re_password = self.cleaned_data.get('re_password')
if re_password == password:
# 校验通过
return self.cleaned_data
else:
raise ValidationError('两次密码不一致')
def register(request):
if request.method == 'GET':
# 生成一个空form对象
register_form = RegisterForm()
return render(request, 'register.html', {'form': register_form})
else:
# 实例化得到对象,传入要校验的数据
# register_form = RegisterForm(data=request.POST)
register_form = RegisterForm(request.POST)
if register_form.is_valid():
# 校验通过,存
# 取出校验通过的数据
print('校验通过')
print(register_form.cleaned_data)
register_form.cleaned_data.pop('re_password')
models.User.objects.create(**register_form.cleaned_data)
return HttpResponse('ok')
else:
# 校验不通过
print('校验不通过')
print(register_form.errors)
error = register_form.errors.get('__all__')[0]
return render(request, 'register.html', {'form': register_form,'error':error})
# <ul class="errorlist"><li>name<ul class="errorlist"><li>Ensure this value has at least 3 characters (it has 1).</li></ul></li></ul>
2 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<h1>自己写</h1>
<form action="" method="post">
<p>用户名:<input type="text" name="name"></p>
<p>密码:<input type="password" name="password"></p>
<p>确认密码:<input type="password" name="re_password"></p>
<p>邮箱:<input type="text" name="email"></p>
<input type="submit" value="提交">
</form>
<hr>
<h2>通过form自动渲染一</h2>
<form action="" method="post">
<p>用户名:{{ form.name }}</p>
<p>密码:{{ form.password }}</p>
<p>确认密码:{{ form.re_password }}</p>
<p>邮箱:{{ form.email }}</p>
<input type="submit" value="提交">
</form>
<hr>
<h2>通过form自动渲染二(基本用这种)</h2>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="" method="post" novalidate>
{% for item in form %}
<div class="form-group">
<p>{{ item.label }}:{{ item }} <span style="color: red">{{ item.errors.0 }}</span></p>
</div>
{% endfor %}
<input type="submit" value="提交"><span style="color: red">{{ error }}</span>
</form>
</div>
</div>
</div>
<hr>
<h2>通过form自动渲染三</h2>
<form action="" method="post">
{{ form.as_p }}
{# {{ form.as_ul }}#}
<input type="submit" value="提交">
</form>
</body>
</html>
Django设置响应头
代码review 保证软件质量
回顾
1 分页
-Django提供的两个类
-Paginator类 page对象
-Page类
2 forms组件
-数据校验
-渲染页面
-错误信息
-局部全局钩子
-使用步骤:
-写一个类,继续Form类
-写字段,字段参数(限制该字段的长短)
-错误信息中文:字段参数
-widget:控制生成标签的属性
-视图函数中:
-实例化得到form对象时,把要校验的数据传入
-is_valiad():clean_data和errors就有值了 即便校验出错clean_data 也可能有值
-如果校验通过就存,不通过就给页面提示
-渲染页面
-for循环的方式渲染页面(在标签前后可以再加标签)
-局部钩子
- def clean_字段名(self):
-检验规则
-如果通过,return 值
-如果不通过,抛异常
-全局钩子(多个字段校验)
-def clean(self):
-如果通过,return clean_data
-如果不通过,抛异常
Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子的更多相关文章
- Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)
1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...
- Django:(5)分页器 & forms组件
Django组件:分页器 目录结构: urls.py from django.contrib import admin from django.urls import path from app01 ...
- Django学习day10随堂笔记
每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...
- Django学习之八:forms组件【对form舒心了】
目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...
- Django(68)drf分页器的使用
前言 当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面 PageNumberPagination:基础分页器,性能略差 LimitOffsetP ...
- Django学习笔记(1)——初识Django
一:Web框架介绍 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速帮你开发特定的系统. Web框架是别人已经设定好的一个web网站模板,你学习它 ...
- Django学习之五:Django 之 注意事项及汇总
目录 Django 之 注意事项及汇总 全局 settings model模块-模型模块 URLs模块 Templates System 模版模块 View/HttpRequest/HttpRespo ...
- Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API
用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...
- Python框架之Django学习笔记(十七)
Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...
随机推荐
- Cookie与HttpSession对象
Cookie与HttpSession对象的作用 维护客户端浏览器与服务端会话状态的两个对象. 由于HTTP协议是一个无状态的协议,因此服务端不会记录当前客户端浏览器的访问状态 有些时候需要服务端能够记 ...
- leetcode_9回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不是. 来 ...
- can总线第一讲
一 官方简介如下: 控制器局域网CAN(Controller Area Network),是由德国Bosch公司为汽车应用而开发的多主机局部网络,应用于汽车的监测和控制.德国Bosch公司开发CAN ...
- 《剑指offer》面试题1:赋值运算函数
面试题1:赋值运算函数 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数 class CMyString { public: CMyString(char* pData = NU ...
- 3.3转1.8V(电平转换)
- HTML5摇一摇(上)—如何判断设备摇动
刚刚过去的一年里基于微信的H5营销可谓是十分火爆,通过转发朋友圈带来的病毒式传播效果相信大家都不太陌生吧,刚好最近农历新年将至,我就拿一个"摇签"的小例子来谈一谈HTML5中如何调 ...
- 如何监控微信小程序HTTP请求错误
摘要: Fundebug的微信小程序错误监控插件更新至0.5.0,支持监控HTTP请求错误. 接入插件 接入Fundebug的错误监控插件非常简单,只需要下载fundebug.0.5.0.min.js ...
- Python计算身体质量指数BMI
使用Python计算身体质量指数BMI 运行结果如下: 源代码: 1 ''' 2 3. 利用函数思想,将"身体质量指数BMI"源程序封装成为一个函数并调用. 3 :param he ...
- 关于allegro找不到env文件解决方法
使用allegro的友人时对于env文件并不陌生.在我们设计的过程中经常使用env文件设置快捷键从而达到快速拉线的目的.但是新安装的allegro软件中会找不到env文件,因为今天自己碰到了这件事,并 ...
- Struts2-值栈的定义
1.值栈的概念:在Struts2里面提供本身的一种储存机制,类似于域对象,可以存值和取值(可以类比Servlet中的域对象->request,session,application) 2.具体操 ...