阅读:45
本篇文章要点:
1.django提供的admin管理后台
2.django中的关系映射
3.如何保持会话状态?(cookie和session)
django提供比较完善的后台管理数据库的接口,想要登录admin管理后台必须先创建超级用户的账号,使用语句(python3 manage.py createsuperuser);然后在(127.0.0.1:8000/admin/)进行登录;进入页面后可以看见如下已自定义好模型的内容:
在管理后台中可以创建用户和组:
在创建用户中,密码进行哈希运算,不可以逆运算,安全度有保证;且创建完成后可对其权限进行修改。
所谓组的概念和部门差不多,你所属哪个部门就规定能做哪些事,组就是把能做的事统一放到一个组中,供用户选择,如下:
注册自定义模型类:
但是上图看起来属性堆积在一起,不够清晰简洁,于是我们可以使用django提供的模型管理器类达到对上述页面修改的效果,也就是使用后端代码改变前端样式;
什么是模型管理器类?
必须继承django.contrib.admin中的ModelAdmin类
使用方法:
from django.contrib import admin
from .models import Book, Author
# Register your models here.
class BookManager(admin.ModelAdmin):
# 列表页显示哪些字段的列,会显示verbose_name 第一个参数
list_display = ['id', 'title', 'pub', 'price']
# 控制list_diplay哪些可以连接到修改页
list_display_links = ['title']
# 添加过滤器
list_filter = ['pub']
# 添加搜索框(模糊查询)
search_fields = ['title']
#添加可在列表页编辑的字段
list_editable = ['price']
class AuthorManager(admin.ModelAdmin):
list_display = ['id', 'name', 'age']
admin.site.register(Book, BookManager)
admin.site.register(Author, AuthorManager)
最终实现效果如下:
常见的关系映射:一对多、一对一、多对多;那么这些关系在ORM中是如何实现的?
使用方法:
OneToOneField(类名,on_delete=xxx) #参数2为级联删除
on_delete字段
在应用模型类中创建以下模型,实现一对一的对应关系:
#models.py
class Author(models.Model):
# wife 反向属性
name = models.CharField('姓名', max_length=11)
class wife(models.Model):
name = models.CharField('姓名',max_length=11)
author = models.OneToOneField(Author, on_delete=models.CASCADE)
一对一关系中有外键的模型类数据创建的两种方式:
author1 = Author.objects.create(name='王老师')
# 有外键的模型类数据创建的两种方式
wife1 = Wife.objects.create(name='王夫人', author=author1) #变量名
wife2 = Wife.objects.create(name='王夫人', author_id= 1 或者 author1.id)# 字段名
查询数据:
正向查询:直接通过外键属性查询(身上有显性的属性)
from .models import wife
w1 = Wife.objects.get(name='王夫人')
print(w1.name,'的老公是',wife.author.name)
反向查询:没有外键属性的一方,调用反向属性查询(django提供的隐藏外键属性的类名小写)
a1 = Author.objects.get(name="王老师")
a1.wife.name
使用方法:
models.Foreignkey("一"的模型类, on_delete=xx)
一对多关系映射需在在多表上设置外键
在模型类中创建,然后在终端迁移数据:
class Publisher(models.Model):
# [一]
name = models.CharField('出版社名称', max_length=50)
class Book(models.Model):
# [多]
title = models.CharField('书名', max_length=11, unique=True)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
在mysql中通过语句show create table otm_book;可以查询创建表的sql语句。
创建数据,同样是两种方法:
from .models import *
pub1 = Publisher.objects.create(name='清华大学出版社')
Book.objects.create(title='Python1', publisher=pub1)
Book.objects.create(title='Python1', publisher_id=1)
正向查询(从多的方向):
b1.publisher.name
反向查询(从一的方向):
pub1 = Publisher.objects.get(name='清华大学出版社')
books = pub1.book_set.all()#拿到出版社相关的所有书
使用方法:
属性=models.ManyToManyField(MyModel)
在应用models.py中创建数据表模式:
class Author(models.Model):
name = models.CharField('姓名', max_length=11)
class Book(models.Model):
title = models.CharField('书名', max_length=11)
author = models.ManyToManyField(Author)
之后在终端迁移数据后,会在mysql中看到django自动创建的第三张表,在数据库中叫做关系表,连接另外两张表不同数据行之间的关系。
创建数据,也有两种方式:
#先创建书再绑定作者
a1 = Author.objects.create(name='王老师')
b1 = a1.book_set.create(title='python')
a2 = Author.objects.create(name='李老师')
a2.book_set.add(b1)
正向查询(有mangtomangfield的):
book.authors.all()
book.authors.filter(ag__gt=80)
反向查询:
author.book_set.all()
author.book_set.filter()
cookies和session实际上是两种存储技术;由于HTTP协议是无状态的,导致会话状态难以保持。所以要通过这两种技术去保持会话状态。
什么是会话?
从打开浏览器访问一个网站到关闭浏览器结束此次访问,称之一次会话
保存在客户端浏览器中的存储空间,以firefox浏览器为例,我们可以在火狐->开发者工具->存储->cookie中找到。
cookies技术的原理:
cookies登录:
1.存储cookies
HttpResponse().setCookies(key,value,max_age, expire)
seCookies参数介绍:
#views.py
def set_cookies(request):
resp = HttpResponse('set cookies is ok!')
resp.set_cookie('uuname', 'gxn', 500)
return resp
刷新页面,查看响应头中会有一个Set-Cookie字段。
2.获取Cookies
通过request.COOKIES绑定的字典(dict)获取客户端的COOKIES数据
#views.py
def get_cookies(request):
value = request.COOKIES.get('uuname')
return HttpResponse('value is %s'%(value))
浏览器会在请求头把cookie数据传递给服务端
3.删除Cookies
HttpResponse.delete_cookie(key)#如果不存在什么则都不会发生
session是在服务器(django)上开辟一段空间用于保留浏览器和服务器交互时的重要数据,然后把sessionid存放在Cookies中,利用cookies的自动提交把sessionid提交给服务器来进行判断。
实现方式:
session初始配置:
在settings.py文件中必须有以下字段:(一般初始创建django时就会有)
INSTALLED_APPS中'django.contrib.sessions'
MIDDLEWARE中'django.contrib.sessions.middleware.SessionMiddleware'
使用方法:
session类似于字典的SessionStore类型的对象,可以用字典的方式使用。
#保存
def set_session(request):
request.session['uname'] = 'arli'
return HttpResponse('set session is ok')
#获取
def get_session(request):
# 强取,session的存活时间与sessionid有关,没有则取不到
value = request.session['uname']
return HttpResponse('session value is %s'%(value))
注意事项: