分页(后端重点)
就是将我们的数据分成N组,每一组有n个数据,能减轻用户的流量使用,减少不必要客户端内存浪费
paginator = Paginator(data, PER_PAGE)
page = paginator.page(页码数)
paginator提供的:
count对象总数
num_pages:页面总数
page_range: 页码列表,从1开始
方法: page(整数): 获得一个page对象
page提供的:
属性:
object_list: 当前页面上所有的数据对象
number: 当前页的页码值
paginator: 当前page关联的Paginator对象
方法:
has_next() :判断是否有下一页
has_previous():判断是否有上一页
has_other_pages():判断是否有上一页或下一页
next_page_number():返回下一页的页码
previous_page_number():返回上一页的页码
len():返回当前页的数据的个数
实现步骤
# 查出所有数据
# 实例化一个分页器
# 通过传过来的页码 获得page对象
# 把page对象里的数据 我们读取出来, 然后返回给前端,(前端也需要有个页面)
代码:
def get_data(req):
# 解析参数
page_num = req.GET.get("page")
# 查出所有数据
data = Engineer.objects.all()
# 实例化一个分页器
paginator = Paginator(data, PER_PAGE)
# 通过传过来的页码 获得page对象
try:
page = paginator.page(page_num)
# 把page对象里的数据 我们读取出来, 然后返回给前端,(前端也需要有个页面)
result = page.object_list
except:
result = []
return render(req, "data.html", {"data": result})
前端分页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<ul>
{% for i in data %}
<li>{{ i.name }}的年纪是{{ i.age }}</li>
{% empty %}
<h1>没有数据啦</h1>
{% endfor %}
</ul>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
{# 判断是否有前一页的数据#}
{% if page.has_previous %}
<a href="/t07/data?page={{ page.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
{% else %}
<a href="/t07/data?page=1" aria-label="Previous">
<span aria-hidden="true">上一页</span>
</a>
{% endif %}
</li>
{# <li><a href="#">1</a></li>#}
{# <li><a href="#">2</a></li>#}
{# <li><a href="#">3</a></li>#}
{# <li><a href="#">4</a></li>#}
{# <li><a href="#">5</a></li>#}
{% for i in page_range %}
<li><a href="/t07/data?page={{ i }}">{{ i }}</a></li>
{% endfor %}
<li>
{% if page.has_next %}
<a href="/t07/data?page={{ page.next_page_number }}" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
{% else %}
<a href="/t07/data?page={{ page_count }}" aria-label="Next">
<span aria-hidden="true">下一页</span>
</a>
{% endif %}
</li>
</ul>
</nav>
</body>
</html>
总结:
前端需要的数据是我们要返回给前端数据的依据(人家要啥 咱给啥)
当我们在查询或处理数据的时候 一些我们后端无法确定的数据 需要通过参数的形式 让前端告诉我们
站点管理
如下是要掌握的
from django.contrib import admin
from .models import *
# Register your models here.
class EngineerAdmin(admin.ModelAdmin):
def is_old(self):
if self.age > 18:
return "老年人"
else:
return "too young,too 三炮"
is_old.short_description = "三炮否"
# 设置显示的字段 数组里放的是我们的模型属性
list_display = ["name", "age", is_old]
# 设置过滤条件
list_filter = ["name"]
# 分页
list_per_page = 5
# 搜索
search_fields = ["name", "age"]
# 设置排序
ordering = ["-age"]
# 设置分组显示
fieldsets = (
("基本信息", {"fields": ("name","age")}),
("额外信息", {"fields": ("age", )})
)
admin.site.register(Engineer, EngineerAdmin)
自定义样式
class MySite(admin.AdminSite):
site_header = "凉凉社区"
site_title = "我是标题"
site_url = "http://www.baidu.com"
site = MySite()
site.register(Engineer, EngineerAdmin)
缓存(非常重要)
帮我们缓冲一些数据, 减轻服务器的压力,同时也可以提高我们的响应速度
使用redis做缓存
配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
使用
装饰器:
from django.views.decorators.cache import cache_page
@cache_page(30) 30是缓存时间30秒
def get_data(req):
# 假装在拼命搜索数据 超级耗时
import time
time.sleep(5)
# 解析参数
page_num = req.GET.get("page")
# 查出所有数据
data = Engineer.objects.all()
# 实例化一个分页器
paginator = Paginator(data, PER_PAGE)
page = None
# 通过传过来的页码 获得page对象
try:
page = paginator.page(page_num)
# 把page对象里的数据 我们读取出来, 然后返回给前端,(前端也需要有个页面)
result = page.object_list
except:
result = []
res = {
"data": result,
"page_range": paginator.page_range,
"page": page,
"page_count": paginator.num_pages #总页码
}
return render(req, "data.html", res)
原生
from django.core.cache import cache, caches
def my_cache_test(req):
# 看缓存有木有数据
# res = cache.get("data")
res = cache_hehe.get("data")
if res:
print("有缓存")
return JsonResponse(res)
else:
# 查询model
data = Company.objects.all()
# 把对象转成字典 model_to_dict
# model_to_dict()
# c_data = [model_to_dict(i) for i in data]
c_data = []
print("被执行")
for i in data:
c_data.append(model_to_dict(i))
result = {"my_data": c_data}
# 设置缓存
# cache.set("data", result, 30)
cache_hehe.set("data", result, 30)
# 返回数据给前端
return JsonResponse(result)
富文本(了解)
样式丰富的文本
装包:
pip install django-tinymce
在settings.py加入配置
# 富文本
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced',
'width': 800,
'height': 600,
}
from tinymce.models import HTMLField
class Blog(models.Model):
title = models.CharField(
max_length=30
)
content = HTMLField()
在admin.py注册
site.register(Blog)
如果样式不在,就把这个第三方的包的样式放入到static目录下