一.forms组件
1 定义
from django import forms
from django.forms import widgets
from django.core.exceptions import ValidationError
# 2 写一个类
class RegForm(forms.Form):
# 3 写属性
name=forms.CharField(max_length=8,min_length=3,label='用户名',error_messages={'max_length':'超长了'},
widget=widgets.TextInput(attrs={'class':'form-control'})
)
# 4 局部钩子函数
def clean_name(self):
name=self.cleaned_data.get('name')
if name.startswith('sb'):
raise ValidationError('不能以sb开头')
else:
# 切记,如果正确,一定要返回name
return name
# 5 全局钩子函数
def clean(self):
#一系列逻辑判断
#如果校验通过:返回cleaned_data
#如果校验不通过:raise ValidationError('两次密码不一致'),错误放到__all__
def clean(self):
pwd=self.cleaned_data.get('pwd')
re_pwd=self.cleaned_data.get('re_pwd')
if pwd==re_pwd:
# 正确,返回self.cleaned_data
return self.cleaned_data
else:
# 校验失败,抛异常
raise ValidationError('两次密码不一致')
2 views中使用: def test(request): if request.method=='GET': regform=RegForm() else: regform=RegForm(request.POST) if regform.is_valid(): #一般情况需要存数据库了 pass else: error_all=regform.errors.get('__all__') # error_all=regform.errors['__all__'] return render(request,'register.html',locals()) 3 模板中使用 <form action=""> {% for foo in regform %} {{ foo.label }}:{{ foo }} <span>{{ foo.errors.0 }}</span> {% endfor %} <input type="submit"> <span>{{ error_all }}</span> </form>
二.cookie和session
1 cookie:由服务器产生,存放在客户端浏览器上的键值对
2 django中使用cookie:
-设置值:
obj=HttpResponse('ok')
obj.set_cookie('key','value',max_age=10)
-取值:
request.COOKIES.get('key')
request.COOKIES['key']
-删除值:
obj=HttpResponse('ok')
obj.delete_cookie('key')
3 session:保存在服务器上的键值对
-设置值:
request.session['key']='value'
request.session['key1']='value1'
1 生成一个随机字符串:dasfasdf
2 在django_session表中存入dasfasdf {'key':'value','key1':value1} 超时时间
3 把sessionid:dasfasdf写入到cookie
-取值:
request.session.get('key')
-删除值:
request.session.flush():全删除
request.session.delete():只删除数据库
-其它配置参数:
了解
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
三.Auth模块
1 Django自带的用户认证模块,可以快速的实现登录,注销,修改密码...
2 扩展auth表,需要继承AbstractUser
然后一定不要忘记在setting中配置:AUTH_USER_MODEL = "app名.UserInfo"
3 它提供的功能
-from django.contrib.auth import authenticate,login,logout
-用户认证:user=authenticate(username=lqz,password=123)
-用户一旦认证通过,调用login(request,user),以后从request.user中就能取出当前登录人对象
-退出:logout(request),request.user就是匿名用户
-校验是否通过认证(是否登录):request.user.is_authenticated()
-创建普通用户
-models.UserInfo.objects.create_user(username=lqz)
-创建超级用户
-models.UserInfo.objects.create_superuser(username=lqz)
-修改密码
-用user对象.set_password(新密码)
-一定要记住save
-校验密码
-check_password(password)
-登录认证装饰器(没有登陆的时候跳转)
-login_required(login_url='/login/')
-全局配置(在setting中配置):
LOGIN_URL = '/login/'
is_staff: 用户是否拥有网站的管理权限:create_superuser:is_staff是1
is_active: 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录
扩展auth表,需要继承AbstractUser
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
"""
用户信息表
"""
nid = models.AutoField(primary_key=True)
phone = models.CharField(max_length=11, null=True, unique=True)
def __str__(self):
return self.username