Auth组件,Forms组件
一、Auth组件默认auth_user表常用操作
#1.配置settings,使django与数据库连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dg74_1',
'USER': 'root',
'PASSWORD': "",
'HOST': '127.0.0.1'
}
} #2.
import pymysql
pymysql.install_as_MySQLdb() #3.直接进行数据库迁移,这样django就会在数据库中建立出一个auth_user表 #操作auth_user 数据库不区分大小写
from django.contrib.auth.models import User
# 1、创建普通用户
User.objects.create_user(username='Henry',password='') # 2、创建超级用户
User.objects.create_superuser(username='root', password='root', email='root@root.com') # 3、获取第一个用户
user = User.objects.first() # 4、修改密码
user.set_password('')
user.save() # 5、校验密码
res = user.check_password('')
print(res) 校验成功:True 校验失败:False
二、Auth组件常用功能
# 1、校验用户账号及密码,校验成功返回user对象
from django.contrib.auth import authenticate
user = authenticate(username=usr, password=pwd) # 2、记录登录状态
#注册用户到request对象中,注册成功可以request.user访问当前登录用户(会形成session记录)
from django.contrib.auth import login
login(request, user) # 注册authenticate成功的用户(当前登录的用户) # 3、注销当前注册的user (用户注销)
from django.contrib.auth import logout
logout(request) # 4、校验用户登录状态
# 视图函数中使用
if request.user.is_authenticated(): pass
# 模板语言中使用
{% if request.user.is_authenticated %}
{% else %}
{% endif %} # 5、校验登录状态的装饰器
from django.contrib.auth.decorators import login_required
@login_required(login_url='/user_login/')
def user_home(request):
return render(request, 'user.html', locals())
后台
from django.shortcuts import render,redirect
from django.contrib.auth import login,logout,authenticate
from django.contrib.auth.decorators import login_required def index(request):
return render(request,'index.html') def user_login(request):
if request.method == 'GET':
return render(request,'login.html')
if request.method == 'POST':
#在请求url中通过next取出回跳的页面路径,因为使用?拼接所以用get取值,没有值返回主页
back_url = request.GET.get('next','/')
usr = request.POST.get('usr',None)
pwd = request.POST.get('pwd',None) #用前台传入的账户密码进行登录校验
user = authenticate(username=usr,password=pwd) if user:
#记录登录状态
login(request,user)
return redirect(back_url) def user_logout(request):
logout(request)
return redirect('/') #装饰器的页面返回key是next:/user_login/?next=/user_order/
@login_required(login_url='/user_login/') #没有登录返回登录界面,登录成功又跳转回该页面
def user_order(request):
return render(request,'order.html',locals()) @login_required(login_url='/user_login/')
def user_home(request):
return render(request,'user.html',locals())
前台
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>主页</h1> <p>
{% if request.user.is_authenticated %}
<a href="/user_home/">{{ request.user.username }}</a>
|
<a href="/user_logout/">注销</a>
{% else %}
<a href="/user_login/">登录</a>
{% endif %}
</p>
<hr>
<a href="/user_order/">订单详情</a> </body>
</html> //{% if request.user.is_authenticated %} 检验用户登录状态
//request.user.username 固定的取法,取得登录的用户名
三、自定义auth模块的user表,将auth_user表替换为app_user表
# app/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
# 增加自定义字段
info = models.TextField(null=True) # settings.py配置,auth模块默认采用的是app应用下的自定义user表
AUTH_USER_MODEL = 'app.User' #数据库迁移后auth_user表不再创建由app_user表替换
四、Form完成表单校验 (自定义错误信息)
'''
1. 校验的字段属性名要与校验的form表单中元素的name值进行匹配
2. 校验字段的参数required
默认为True,代表数据必须传入该校验值
如果设置为False,校验数据中可以不包含该校验值(可以为空),但如果输入了该字段就会对其进行校验
3. error_messages自定义校验失败的错误信息
''' '''
from django import forms
class CheckForm(forms.Form):
usr = forms.CharField(min_length=3, max_length=10)
pwd = forms.CharField(
min_length=3,
max_length=10,
error_messages={
"min_length": "最少3", # 某个校验规则对应的中文提示的错误信息
"max_length": "最多10",
'required': "必填项" # 除了自定义校验规则,还可以明确默认校验规则的中文提示错误信息
}
) def register(request):
check_form = CheckForm(request.POST)
if check_form.is_valid():
print("校验成功")
print(check_form.cleaned_data)
else:
print("校验失败")
print(check_form.cleaned_data) # 如果部分成功,仍然可以获得部分成功的数据
print(check_form.errors) # 部分失败的信息
'''
五、局部钩子:在系统提供的校验结束后,在对具体的字段进行自定义二次校验
class CheckForm(forms.Form):
usr = forms.CharField(...)
# ...
# 局部钩子
def clean_usr(self):
cleaned_usr = self.cleaned_data.get('usr', None)
# 自定义校验规则
import re
if re.match('^[0-9]', cleaned_usr): # 通过正则匹配不能以数字开头
from django.core.exceptions import ValidationError
raise ValidationError('不能以数字开头') # 抛ValidationError信息就会被添加到self.errors中
return cleaned_usr
六、全局钩子:在系统提供的校验结束后,在对所有的字段进行自定义二次校验
class CheckForm(forms.Form):
# ...
# 全局钩子
def clean(self):
cleaned_pwd = self.cleaned_data.get('pwd', None)
cleaned_re_pwd = self.cleaned_data.get('re_pwd', None)
if cleaned_pwd != cleaned_re_pwd:
from django.core.exceptions import ValidationError
raise ValidationError('两次密码不一致') # 抛ValidationError信息就会被添加到self.errors中
return self.cleaned_data
后台
from django.shortcuts import render,redirect
from django import forms class CheckForm(forms.Form):
usr = forms.CharField(min_length=3,max_length=10,
error_messages={
'required':'必须填',
'min_length':'最少3',
'max_length':'最多10'
})
pwd = forms.CharField(min_length=3,max_length=10,
error_messages={
'required':'必须填',
'min_length':'最少3',
'max_length':'最多10'
})
re_pwd = forms.CharField(min_length=3,max_length=10,
error_messages={
'required':'必须填',
'min_length':'最少3',
'max_length':'最多10'
})
email = forms.EmailField(
error_messages={
'invalid':'email格式不正确',
'required':'必填项'
}
)
# 局部钩子:对usr进行局部钩子的校验,该方法会在usr属性校验通过后,系统调用该方法继续校验,是一个回调函数
def clean_usr(self):
cleaned_usr = self.cleaned_data.get('usr', None) # type: str # 通过正则匹配不能以数字开头
import re
if re.match('^[0-9]', cleaned_usr):
from django.core.exceptions import ValidationError
raise ValidationError('不能以数字开头')
return cleaned_usr #返回局部钩子校验的数据 # 全局钩子:代表校验类中的所有属性校验通过后,系统调用该方法继续校验
def clean(self):
cleaned_pwd = self.cleaned_data.get('pwd', None)
cleaned_re_pwd = self.cleaned_data.get('re_pwd', None)
if cleaned_pwd != cleaned_re_pwd:
from django.core.exceptions import ValidationError
raise ValidationError('两次密码不一致') #抛出异常,必须接受,否则报错
return self.cleaned_data #全部返回 def register(request):
if request.method == 'GET':
return render(request,'register.html')
if request.method == 'POST':
check_form = CheckForm(request.POST)
if check_form.is_valid():
print('校验成功')
print(check_form.cleaned_data)
else:
print('校验失败')
print(check_form.cleaned_data)
print(check_form.errors)
return redirect('/')
前台
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>注册</title>
</head>
<body>
<form action="" method="post" novalidate>
<p>
<label for="usr">账号:</label>
<input type="text" name="usr" id="usr">
</p>
<p>
<label for="pwd">密码:</label>
<input type="password" name="pwd" id="pwd">
</p>
<p>
<label for="re_pwd">确认:</label>
<input type="password" name="re_pwd" id="re_pwd">
</p>
<p>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email">
</p>
<input type="submit" value="注册">
</form>
</body>
</html>
七、模板渲染
class CheckForm(forms.Form):
# 校验需求:账号不能以数字开头
usr = forms.CharField(min_length=3, max_length=10, label="账号:",
error_messages={
'required': "必填项",
'min_length': "最少3",
'max_length': "最多10"
})
pwd = forms.CharField(min_length=3, max_length=10, label="密码:",
error_messages={
'required': "必填项",
'min_length': "最少3",
'max_length': "最多10"
},
widget=forms.PasswordInput(attrs={
'class': 'pwd',
'placeholder': '请输入密码'
})
)
re_pwd = forms.CharField(min_length=3, max_length=10, label="确认:",
error_messages={
'required': "必填项",
'min_length': "最少3",
'max_length': "最多10"
},
widget=forms.PasswordInput)
email = forms.EmailField(label="邮箱:",
error_messages={
'invalid': "格式不正确",
'required': "必填项"
}
) # 局部钩子:对usr进行局部钩子的校验,该方法会在usr属性校验通过后,系统调用该方法继续校验
def clean_usr(self):
cleaned_usr = self.cleaned_data.get('usr', None) # type: str
# 通过正则匹配不能以数字开头
import re
if re.match('^[0-9]', cleaned_usr):
from django.core.exceptions import ValidationError
raise ValidationError('不能以数字开头')
return cleaned_usr # 全局钩子:代表校验类中的所有属性校验通过后,系统调用该方法继续校验
def clean(self):
cleaned_pwd = self.cleaned_data.get('pwd', None)
cleaned_re_pwd = self.cleaned_data.get('re_pwd', None)
if cleaned_pwd != cleaned_re_pwd:
from django.core.exceptions import ValidationError
raise ValidationError('两次密码不一致')
return self.cleaned_data def register(request):
if request.method == "GET":
check_form = CheckForm()
if request.method == "POST":
check_form = CheckForm(request.POST)
if check_form.is_valid():
return HttpResponse('注册成功')
else:
print(check_form.errors.as_data)
all_error = check_form.errors.get('__all__')
return render(request, 'register.html', locals())
渲染方法1
<form action="" method="post" novalidate>
<p>
<label for="id_usr">账号:</label>
{{ check_form.usr }}
</p>
<p>
<label for="id_pwd">密码:</label>
{{ check_form.pwd }}
</p>
<p>
<label for="id_re_pwd">确认:</label>
{{ check_form.re_pwd }}
</p>
<p>
<label for="id_email">邮箱:</label>
{{ check_form.email }}
</p>
<input type="submit" value="注册">
</form> //命名规范 id_ 这样点击输入框前的名字也可以选定输入框
渲染方法2
<form action="" method="post" novalidate>
{% for ele in check_form %}
<p>
<label for="">{{ ele.label }}</label>
{{ ele }}
<span style="color: red;">{{ ele.errors.0 }}</span>
{% if ele == check_form.re_pwd %}
<span style="color: red;">{{ all_error.0 }}</span>
{% endif %}
</p>
{% endfor %}
<input type="submit" value="注册">
</form>
渲染方式3
<form action="" method="post" novalidate>
{{ check_form.as_p }}
<input type="submit" value="注册">
</form>
<hr>
渲染方式了解
<table>
{{ check_form.as_table }}
</table> <ul>
{{ check_form.as_ul }}
</ul>
Auth组件,Forms组件的更多相关文章
- django第13天(auth组件,forms组件,中间件,csrf)
django第13天(auth组件,forms组件) auth组件 -auth组件 -auth是什么? -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码.... -怎么用? -( ...
- python 全栈开发,Day78(Django组件-forms组件)
一.Django组件-forms组件 forms组件 django中的Form组件有以下几个功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显 ...
- Django组件-Forms组件
Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...
- Django组件--forms组件(注册用)
一.forms组件--校验类的使用 二.form组件--校验类的参数 三.forms组件校验的局部钩子--自定义校验规则(要看源码理解) 四.forms组件校验的全局钩子--校验form表单两次密码输 ...
- Django组件—forms组件
forms组件: 校验字段功能: 针对一个实例:注册用户. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...
- Django组件——forms组件
一.校验字段功能 通过注册用户这个实例来学习校验字段功能. 1.模型:models.py from django.db import models # Create your models here. ...
- 12 Django组件-forms组件
forms组件 校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_l ...
- Django组件:forms组件(简易版)
一.校验字段功能 1.模型:models.py class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=model ...
- 08 Django组件-Forms组件
Django的Forms组件主要有以下几大功能: 页面初始化,生成HTML标签 校验用户数据(显示错误信息) HTML Form提交保留上次提交数据 一.小试牛刀 1.定义Form类 from dja ...
随机推荐
- java基础(一) -语法
基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...
- sqli-labs(八)——修改密码处sql注入+http头sql注入
第17关: 这是一个重置密码的功能存在sqk注入,尝试账号密码都输入'",发现只会显示登陆失败,没有报错信息. 这个时候先推测一下后台的sql形式大概应该是: update users se ...
- tp连贯操作
链接数据库 首先写配置文件 复制concentration.php中的 /* 数据库设置 */ 'DB_TYPE' => '', // 数据库类型 'DB_HOST' => '', // ...
- 关于Python veriable scope 的一点疑问
在写程序中遇到了类似于以下代码的问题: #不会报错 a=1 def f(): print(a) f() #会报错 a=1 def f(): a+=1 f()
- 关于 LD_LIBRARY_PATH 这个环境变量
这个变量中可以保存linux寻找库时搜索的路径,按照一篇文章中的介绍,不应该设置这个变量.文章的重点如下: 1. 不要设置这个变量. 2. Solaris中,在编译时,使用 -L 选项指定编译时库的搜 ...
- <1>lua编译环境 数据类型和局部变量
1.编译环境 http://www.lua.org/download.html下载 解压后 bin目录中lua.exe运行 luac.exe编译成lua字节码 2.基本数据类型 整数,小数,布尔值 ...
- 【转】C#中base关键字的几种用法
base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法.例如: 2.1关于base调用基类构造函数 public c ...
- Palindrome Bo (预处理 + 区间DP)
先进行离散化,然后再预处理出所有位置的下一个元素,做好这一步对时间的优化非常重要. 剩下的就是一般的DP了.区间DP #include<bits/stdc++.h> using names ...
- Solid Dominoes Tilings (轮廓线dp打表 + 容器)
第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...
- Java基础语法(三)
七.方法 定义: 方法就是完成特定功能的代码块 在很多语言里面都有函数的定义 函数在Java中被称为方法 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; ...