分页 站点管理 缓存 富文本

分页(后端重点)

就是将我们的数据分成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)

缓存(非常重要)

帮我们缓冲一些数据, 减轻服务器的压力,同时也可以提高我们的响应速度

扫描二维码关注公众号,回复: 4191447 查看本文章

使用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,
}

在models.py

from tinymce.models import HTMLField
class Blog(models.Model):
    title = models.CharField(
        max_length=30
    )
    content = HTMLField()

在admin.py注册

site.register(Blog)

如果样式不在,就把这个第三方的包的样式放入到static目录下

猜你喜欢

转载自blog.csdn.net/wujialaoer/article/details/83831399