分頁 站點管理 快取 富文字
阿新 • • 發佈:2018-11-23
分頁(後端重點)
就是將我們的資料分成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目錄下