django 提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用
django 会搜集所有已注册的模型类,为这些模型类提拱数据管理界面,供开发者使用
使用步骤:
创建后台管理帐号:
后台管理–创建管理员帐号
$ python3 manage.py createsuperuser
$ python3 manage.py createsuperuser
Username (leave blank to use 'tarena'): tarena # 此处输入用户名
Email address: [email protected] # 此处输入邮箱
Password: # 此处输入密码(密码要复杂些,否则会提示密码太简单)
Password (again): # 再次输入重复密码
Superuser created successfully.
$
用注册的帐号登陆后台管理界面
若要自己定义的模型类也能在 /admin
后台管理界中显示和管理,需要将自己的类注册到后台管理界面
添加自己定义模型类的后台管理数据表的,需要用admin.site.register(自定义模型类)
方法进行注册
配置步骤如下:
在应用app中的admin.py中导入注册要管理的模型models类, 如:
from . import models
调用 admin.site.register 方法进行注册,如:
from django.contrib import admin
admin.site.register(自定义模型类)
如: 在 bookstore/admin.py 添加如下代码对Book类进行管理
示例:
# file: bookstore/admin.py
from django.contrib import admin
# Register your models here.
from . import models
...
admin.site.register(models.Book) # 将Book类注册为可管理页面
在admin后台管理数据库中对自定义的数据记录都展示为 XXXX object
类型的记录,不便于阅读和判断
在用户自定义的模型类中可以重写 def __str__(self):
方法解决显示问题,如:
class Book(models.Model):
...
def __str__(self):
return "书名" + self.title
作用:
说明:
django.contrib.admin
里的 ModelAdmin
类模型管理器的使用方法:
在 <应用app>/admin.py
里定义模型管理器类
class XXXX_Manager(admin.ModelAdmin):
......
注册管理器与模型类关联
from django.contrib import admin
from . import models
admin.site.register(models.YYYY, XXXX_Manager) # 注册models.YYYY 模型类与 管理器类 XXXX_Manager 关联
示例:
# file : bookstore/admin.py
from django.contrib import admin
from . import models
class BookAdmin(admin.ModelAdmin):
list_display = ['id', 'title', 'price', 'market_price']
admin.site.register(models.Book, BookAdmin)
模型管理器类ModelAdmin中实现的高级管理功能
修改模型类字段的显示名字
模型类各字段的第一个参数为 verbose_name,此字段显示的名字会在后台数据库管理页面显示
通过 verbose_name 字段选项,修改显示名称示例如下:
title = models.CharField(
max_length = 30,
verbose_name='显示名称'
)
通过Meta内嵌类 定义模型类的属性及展现形式
模型类可以通过定义内部类class Meta 来重新定义当前模型类和数据表的一些属性信息
用法格式如下:
class Book(models.Model):
title = CharField(....)
class Meta:
1. db_table = '数据表名'
- 该模型所用的数据表的名称。(设置完成后需要立马更新同步数据库)
2. verbose_name = '单数名'
- 给模型对象的一个易于理解的名称(单数),用于显示在/admin管理界面中
3. verbose_name_plural = '复数名'
- 该对象复数形式的名称(复数),用于显示在/admin管理界面中
语法
class A(model.Model):
...
class B(model.Model):
属性 = models.OneToOneField(A)
用法示例
创建作家和作家妻子类
# file : xxxxxxxx/models.py
from django.db import models
class Author(models.Model):
'''作家模型类'''
name = models.CharField('作家', max_length=50)
class Wife(models.Model):
'''作家妻子模型类'''
name = models.CharField("妻子", max_length=50)
author = models.OneToOneField(Author) # 增加一对一属性
查询
创始一对一的数据记录
from . import models
author1 = models.Author.objects.create(name='王老师')
wife1 = models.Wife.objects.create(name='王夫人', author=author1) # 关联王老师
author2 = models.Author.objects.create(name='小泽老师') # 一对一可以没有数据对应的数据
一对一数据的相互获取
正向查询
# 通过 wife 找 author
from . import models
wife = models.Wife.objects.get(name='王夫人')
print(wife.name, '的老公是', wife.author.name)
反向查询
实例对象.引用类名(小写)
,如作家的反向引用为作家对象.wife
# 通过 author.wife 关联属性 找 wife,如果没有对应的wife刚触发异常
author1 = models.Author.objects.get(name='王老师')
print(author1.name, '的妻子是', author1.wife.name)
author2 = models.Author.objects.get(name='小泽老师')
try:
print(author2.name, '的妻子是', author2.wife.name)
except:
print(author2.name, '还没有妻子')
用法语法
class A(model.Model):
...
class B(model.Model):
属性 = models.ForeignKey(多对一中"一"的模型类, ...)
外键类ForeignKey
构造函数:
ForeignKey(to, on_delete, **options)
常用参数:
**options
可以是常用的字段选项如:
示例
清华大学出版社
有书
北京大学出版社
有书
定义一对多类
# file: one2many/models.py
from django.db import models
class Publisher(models.Model):
'''出版社'''
name = models.CharField('名称', max_length=50, unique=True)
class Book(models.Model):
title = models.CharField('书名', max_length=50)
publisher = models.ForeignKey(Publisher, null=True)
创建一对多的对象
# file: xxxxx/views.py
from . import models
pub1 = models.Publisher.objects.create(name='清华大学出版社')
models.Book.objects.create(title='C++', publisher=pub1)
models.Book.objects.create(title='Java', publisher=pub1)
models.Book.objects.create(title='Python', publisher=pub1)
pub2 = models.Publisher.objects.create(name='北京大学出版社')
models.Book.objects.create(title='西游记', publisher=pub2)
models.Book.objects.create(title='水浒', publisher=pub2)
查询:
# 通过一本书找到对应的出版社
abook = models.Book.objects.get(id=1)
print(abook.title, '的出版社是:', abook.publisher.name)
# 通过出版社查询对应的书
pub1 = models.Publisher.objects.get(name='清华大学出版社')
books = pub1.book_set.all() # 通过book_set 获取pub1对应的多个Book数据对象
# books = models.Book.objects.filter(publisher=pub1) # 也可以采用此方式获取
print("清华大学出版社的书有:")
for book in books:
print(book.title)
数据查询
通过 Book 查询 Publisher
通过 publisher 属性查询即可
练习:
查询 西游记 对应的出版社信息,打印在终端上
通过 Publisher 查询 对应的所有的 Books
Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用
属性:book_set(MyModel.objects)
语法
属性 = models.ManyToManyField(MyModel)
示例
class Author(models.Model):
...
class Book(models.Model):
...
authors = models.ManyToManyField(Author)
数据查询
通过 Book 查询对应的所有的 Authors
book.authors.all() -> 获取 book 对应的所有的author的信息
book.authors.filter(age__gt=80) -> 获取book对应的作者中年龄大于80岁的作者的信息
通过 Author 查询对应的所有的Books
author.book_set.all()
author.book_set.filter()
author.book_set.create(...) # 创建新书并联作用author
author.book_set.add(book) # 添加已有的书为当前作者author
author.book_set.clear() # 删除author所有并联的书
author.book_set.remove() # 删除所author所有并联的书
示例:
class Author(models.Model):
'''作家模型类'''
name = models.CharField('作家', max_length=50)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField('书名', max_length=50)
author = models.ManyToManyField(Author, null=True)
def __str__(self):
return self.title
from django.http import HttpResponse
from . import models
def many2many_init(request):
# 创建两人个作者
author1 = models.Author.objects.create(name='吕泽')
author2 = models.Author.objects.create(name='魏老师')
# 吕择和魏老师同时写了一本Python
book11 = author1.book_set.create(title="Python")
author2.book_set.add(book11) #
# 魏老师还写了两本书
book21 = author2.book_set.create(title="C") # 创建一本新书"C"
book22 = author2.book_set.create(title="C++") # 创建一本新书"C++"
return HttpResponse("初始化成功")
def show_many2many(request):
authors = models.Author.objects.all()
for auth in authors:
print("作者:", auth.name, '发出版了', auth.book_set.count(), '本书: ')
for book in books:
print(' ', book.title)
print("----显示书和作者的关系----")
books = models.Book.objects.all()
for book in books:
auths = book.author.all()
print(book.title, '的作者是:', '、'.join([str(x.name) for x in auths]))
return HttpResponse("显示成功,请查看服务器端控制台终端")
mysql> select * from many2many_author;
+----+-----------+
| id | name |
+----+-----------+
| 11 | 吕泽 |
| 12 | 魏老师 |
+----+-----------+
2 rows in set (0.00 sec)
mysql> select * from many2many_book;
+----+--------+
| id | title |
+----+--------+
| 13 | Python |
| 14 | C |
| 15 | C++ |
+----+--------+
3 rows in set (0.00 sec)
mysql> select * from many2many_book_author;
+----+---------+-----------+
| id | book_id | author_id |
+----+---------+-----------+
| 17 | 13 | 11 |
| 20 | 13 | 12 |
| 18 | 14 | 12 |
| 19 | 15 | 12 |
+----+---------+-----------+
4 rows in set (0.00 sec)
cookies是保存在客户端浏览器上的存储空间,通常用来记录浏览器端自己的信息和当前连接的确认信息
cookies 在浏览器上是以键-值对的形式进行存储的,键和值都是以ASCII字符串的形存储(不能是中文字符串)
cookies 的内部的数据会在每次访问此网址时都会携带到服务器端,如果cookies过大会降低响应速度
在Django 服务器端来设置 设置浏览器的COOKIE 必须通过 HttpResponse 对象来完成
HttpResponse 关于COOKIE的方法
Django中的cookies
使用 响应对象HttpResponse 等 将cookie保存进客户端
方法1
from django.http import HttpResponse
resp = HttpResponse()
resp.set_cookie('cookies名', cookies值, 超期时间)
resp = HttpResponse()
resp.set_cookie('myvar', "weimz", 超期时间)
方法二, 使用render对象
from django.shortcuts import render
resp = render(request,'xxx.html',locals())
resp.set_cookie('cookies名', cookies值, 超期时间)
获取cookie
通过 request.COOKIES 绑定的字典(dict) 获取客户端的 COOKIES数据
value = request.COOKIES.get('cookies名', '没有值!')
print("cookies名 = ", value)
注:
Application
>> Storage
>> Cookies
查看和操作浏览器端所有的 Cookies 值cookies 示例
以下示例均在视图函数中调用
添加cookie
# 为浏览器添加键为 my_var1,值为123,过期时间为1个小时的cookie
responds = HttpResponse("已添加 my_var1,值为123")
responds.set_cookie('my_var1', 123, 3600)
return responds
修改cookie
# 为浏览器添加键为 my_var1,修改值为456,过期时间为2个小时的cookie
responds = HttpResponse("已修改 my_var1,值为456")
responds.set_cookie('my_var1', 456, 3600*2)
return responds
删除cookie
# 删除浏览器键为 my_var1的cookie
responds = HttpResponse("已删除 my_var1")
responds.delete_cookie('my_var1')
return responds
获取cookie
# 获取浏览器中 my_var变量对应的值
value = request.COOKIES.get('my_var1', '没有值!')
print("cookie my_var1 = ", value)
return HttpResponse("my_var1:" + value)
综合练习:
实现用户注册功能,界面如下:
要求 :
python3 manage.py startapp user
模型类
用户模型类
class User(models.Model):
username = models.CharField("用户名", max_length=30, unique=True)
password = models.CharField("密码", max_length=30)
def __str__(self):
return "用户" + self.username
登陆设计规范(在user应用中写代码)
路由正则 | 视图函数 | 模板位置 | 说明 |
---|---|---|---|
/user/reg | def reg_view(request): | templates/user/register.html | 用户注册 |
什么是session
session又名会话控制,是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
session的起源
实现方式
Django启用Session
在 settings.py 文件中
向 INSTALLED_APPS 列表中添加:
INSTALLED_APPS = [
# 启用 sessions 应用
'django.contrib.sessions',
]
向 MIDDLEWARE_CLASSES 列表中添加:
MIDDLEWARE = [
# 启用 Session 中间件
'django.contrib.sessions.middleware.SessionMiddleware',
]
session的基本操作:
request.session['KEY'] = VALUE
VALUE = request.session['KEY']
VALUE = request.session.get('KEY', 缺省值)
del request.session['KEY']
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
import django.conf.global_settings
注: 当使用session时需要迁移数据库,否则会出现错误
$ python3 manage.py makemigrations
$ python3 manage.py migrate