内容

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组件全局钩子,局部钩子的更多相关文章

  1. Django学习——图书管理系统图书修改、orm常用和非常用字段(了解)、 orm字段参数(了解)、字段关系(了解)、手动创建第三张表、Meta元信息、原生SQL、Django与ajax(入门)

    1 图书管理系统图书修改 1.1 views 修改图书获取id的两种方案 1 <input type="hidden" name="id" value=& ...

  2. Django:(5)分页器 & forms组件

    Django组件:分页器 目录结构: urls.py from django.contrib import admin from django.urls import path from app01 ...

  3. Django学习day10随堂笔记

    每日测验 """ 今日考题 1.默写ajax基本语法,及提交json数据和文件都需要添加哪些额外参数 2.什么是序列化,截止目前为止你所接触过的序列化有哪些 3.批量插入 ...

  4. Django学习之八:forms组件【对form舒心了】

    目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...

  5. Django(68)drf分页器的使用

    前言 当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面 PageNumberPagination:基础分页器,性能略差 LimitOffsetP ...

  6. Django学习笔记(1)——初识Django

    一:Web框架介绍 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速帮你开发特定的系统. Web框架是别人已经设定好的一个web网站模板,你学习它 ...

  7. Django学习之五:Django 之 注意事项及汇总

    目录 Django 之 注意事项及汇总 全局 settings model模块-模型模块 URLs模块 Templates System 模版模块 View/HttpRequest/HttpRespo ...

  8. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

  9. Python框架之Django学习笔记(十七)

    Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...

随机推荐

  1. func-spring-boot-starter 匿名函数托管

    func-spring-boot-starter 匿名函数托管 GitHub项目路径: https://github.com/yiurhub/func-spring-boot-starter Gite ...

  2. Visual Studio App Center 中的 Bug 跟踪服务

    我在之前的一篇文章 <使用 Visual Studio App Center 持续监视应用使用情况和问题> 中介绍了 App Center 的基本功能及使用入门,其中 诊断 可以自动手机用 ...

  3. ModelSerializer序列化器实战

    目录 ModelSerializer序列化器实战 单表操作 序列化器类 视图类 路由 模型 多表操作 models.py serializer.py views.py urls.py ModelSer ...

  4. Python中对象、类型、元类之间的关系

    Python里的对象.类型和元类的关系很微妙也很有意思. 1989年圣诞节期间,上帝很无聊,于是创造了一个世界. 对象 在这个世界的运转有几条定律. 1.一切都是对象 对象(object)是这个世界的 ...

  5. 16_伯德图_手绘技巧与应用_Bode Plot_Part2

  6. vuex基础详解

    vuex入门 安装 vuex为我们提供了两种使用方法 直接引入 vuex下载地址:https://unpkg.com/vuex@2.0.0 下载之后用< script >标签包裹引入即可 ...

  7. link和@import的区别浅析

    我们都知道,外部引入 CSS 有2种方式,link标签和@import.它们有何本质区别,有何使用建议,在考察外部引入 CSS 这部分内容时,经常被提起. 如今,很多学者本着知其然不欲知其所以然的学习 ...

  8. 关于20组---三重奏的meet的评价

    meet这一软件是一款交友软件,新版本完善了以前版本的各种不足,而且能够通过手机号发验证码来创建新账户,功能多样,可以在星球.广场找到自己感兴趣的人,基本满足的交友需求. 但有一点不足之处,就是缺少创 ...

  9. 为Anaconda python3安装gi模块

    项目开发中需要使用到gi模块,Ubuntu自带的Python3.5可以正常使用gi.项目解释环境是Anaconda python3.5,提示ImportError: No module named ' ...

  10. XXE漏洞——介绍及利用

    什么是xxe XML外部实体注入,简称XXE漏洞.XML文档结构包括XML声明,DTD文档类型定义,文档元素. XML示例 <?xml version="1.0"?>X ...