Python-Django-Ajax进阶2
-forms组件的渲染错误信息
在模板中:<span>{{ foo.errors.0 }}</span>
-forms使用bootstrap样式
widget=widgets.EmailInput(attrs={'class':'form-control'}))
-全局和局部钩子函数
AOP:面向切面编程
-局部钩子函数(再校验name)
def clean_name(self): # 从cleaned_data中取出字段的值 name = self.cleaned_data.get('name') # # 校验是否以sb开头 if name.startswith('sb'): raise ValidationError('不能以sb开头') else: return name
-全局钩子函数
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('两次密码不一致')
cookie,session,token
cookie
-cookie是存在浏览器上的键值对{'name':'lqz','password':123}
-服务器写到浏览器上的
session:
-因为cookie不安全,所有出了session
-存在于服务器上的键值对 'sfdasdfa':{'name':'lqz','password':123}
token:(待研究)
cookie的使用:
设置cookie:
-HttpResponse的对象 obj.set_cookie(key,value,超时时间)
-obj.set_signed_cookie('name','egon',salt='123')
取cookie:
-request.COOKIES.get(key)
-name=request.get_signed_cookie('name',salt='123')
删除:
HttpResponse的对象 obj.delete_cookie('is_login')
session的使用:
设置
-request.session['name']=‘lqz’
-request.session['age']=‘18’
取cookie:
-request.session.get('name')
删除:
-request.session.delete() 只删数据库
-request.session.flush() 浏览器cookie和数据库
了解:其他参数(超时时间)
auth组件
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
扩展默认的auth_user表
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
注意:
按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:
# 引用Django自带的User表,继承使用时需要设置 AUTH_USER_MODEL = "app名.UserInfo"
再次注意:
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。
ContentTypefrom django.db import models
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Course(models.Model): title = models.CharField(max_length=32) # 不会在数据库中生成字段,只用于数据库操作
policy = GenericRelation('PricePolicy',object_id_field='object_id',content_type_field='contentType') class DegreeCourse(models.Model): title = models.CharField(max_length=32) class PricePolicy(models.Model):
# 跟ContentType表做外键关联 contentType = models.ForeignKey(to=ContentType) # 正数 object_id = models.PositiveIntegerField() # 引入一个字段,不会在数据库中创建,只用来做数据库操作 content_obj = GenericForeignKey('contentType', 'object_id')
period = models.CharField(max_length=32) price = models.FloatField()
TTL: