1. 程式人生 > >分頁 站點管理 快取 富文字

分頁 站點管理 快取 富文字

分頁(後端重點)

就是將我們的資料分成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,
}

在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目錄下