1. 程式人生 > >Django框架學習筆記(19.自定義分頁)

Django框架學習筆記(19.自定義分頁)

在講自定義分頁之前,先講一個簡單的。

在模板語言中還有一些特殊的存在,比如這個:

def tpl4(request):
    name = "asdf123456"
return render(request, 'tpl4.html', {'name': name})

tpl4.html:

<body>
{{ name }}
{{ name|upper }}
</body>

執行後:


這些我們只需瞭解,但應該要學會自定義這種操作:

自定義simple_tag:

1.在某個app目錄下建立一個名為templatetags資料夾(必須為這個名字)

2.在資料夾內建立py檔案寫入函式(任意取名)‘

3.寫函式之前還有一個固定的格式,不能變,然後記得要在settings裡面註冊app

例:建立了一個st.py

from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def func(a1, a2):
    return a1 + a2

4.在html檔案中固定格式:

{% load st %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"> <title>Title</title> </head> <body> {% func 6 7 %} </body> </html>

這裡就實現了一個加法功能。

自定義filter:

和上面這個差不過,不過它只能傳2個引數:

from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def func(a1, a2): return a1 + a2

html中:

<body>
{{ "fun"|func:"ction" }}
</body>

看似這種遠不如上面那種好用,不過,它也有它的優點:

{% if "fun"|func:"ction" %}
{% endif %}

它可以用於if判斷中,不過simple_tag不支援

自定義分頁:

這裡做一個簡單的分頁示例:

views.py加入:

LIST = []
for i in range(109):
    LIST.append(i)
    
def user_list(request):
    current_page = request.GET.get('p', 1)
    current_page = int(current_page)
    start = (current_page - 1) * 10
end = current_page * 10
data = LIST[start: end]
    all_count = len(LIST)
    count, y = divmod(all_count, 10)
    if y:
        count += 1
page_list = []
    for i in range(1, count + 1):
        if i == current_page:
            temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i)
        else:
            temp = '<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i)
        page_list.append(temp)
    from django.utils.safestring import mark_safe
    page_str = "".join(page_list)
    page_str = mark_safe(page_str)
    # 為了防止XSS攻擊
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})

user_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
.pagination .page{
            display: inline-block;
padding: 5px;
background-color: aqua;
margin: 5px;
}
        .pagination .active{
            background-color: brown;
color: white;
}
    </style>
</head>
<body>
<ul>
{% for item in li %}
        {% include 'li.html' %}
    {% endfor %}
</ul>
<div class="pagination">
{{ page_str }}
</div>
</body>
</html>

順便用下上一篇的知識:

li.html:

<li>{{ item }}</li>

效果這樣:


選中的那個會變成紅色的。

這裡做到了,但是如果資料過多,就顯得不好了。

完善:

LIST = []
for i in range(1009):
    LIST.append(i)

def user_list(request):
    current_page = request.GET.get('p', 1)
    current_page = int(current_page)
    per_page_count = 10
start = (current_page - 1) * per_page_count
    end = current_page * per_page_count
    data = LIST[start: end]
    all_count = len(LIST)
    total_count, y = divmod(all_count, per_page_count)
    if y:
        total_count += 1
page_list = []
    page_num = 11
if total_count <= page_num:
        start_index = 1
end_index = total_count+1
else:
        if current_page <= (page_num+1)/2:
            start_index = 1
end_index = page_num+1
else:
            start_index = current_page-(page_num-1)/2
end_index = current_page+(page_num+1)/2
if (current_page+(page_num-1)/2) > total_count:
                end_index = total_count+1
start_index = total_count-(page_num-1)

    if int(current_page) == 1:
        prev = '<a class="page" href="javascript:void(0);">上一頁</a>'
else:
        prev = '<a class="page" href="/user_list/?p=%s">上一頁</a>' % (current_page-1)
    page_list.append(prev)

    for i in range(int(start_index), int(end_index)):
        if i == current_page:
            temp = '<a class="page active" href="/user_list/?p=%s">%s</a>' % (i, i)
        else:
            temp = '<a class="page" href="/user_list/?p=%s">%s</a>' % (i, i)
        page_list.append(temp)


    if current_page == total_count:
        nex = '<a class="page" href="javascript:void(0);">下一頁</a>'
else:
        nex = '<a class="page" href="/user_list/?p=%s">下一頁</a>' % (current_page+1)
    page_list.append(nex)

    jump = '''
    <input type="text"/><a onclick='jumpTo(this, "/user_list/?p=");'>GO</a>
    <script>
        function jumpTo(ths,base){
             var val = ths.previousSibling.value;
             location.href = base + val;
        }
    </script>
    '''
page_list.append(jump)

    from django.utils.safestring import mark_safe
    page_str = "".join(page_list)
    page_str = mark_safe(page_str)
    # 為了防止XSS攻擊
return render(request, 'user_list.html', {'li': data, 'page_str': page_str})

完善後的效果:


發現程式碼量很大,可以對它進行封裝:

創一個utils資料夾,新建一個pagination.py

class Page:
    def __init__(self, current_page, data_count, per_page_count=10, page_num=7):
        self.current_page = current_page
        self.data_count = data_count
        self.per_page_count = per_page_count
        self.page_num = page_num

    def start(self):
        return (self.current_page - 1) * self.per_page_count

    def end(self):
        return self.current_page * self.per_page_count

    def all_count(self):
        v, y = divmod(self.data_count, self.per_page_count)
        if y:
            v += 1
return v

    def page_str(self, base_url):
        page_list = []
        if self.all_count() <= self.page_num:
            start_index = 1
end_index = self.all_count() + 1
else:
            if self.current_page <= (self.page_num + 1) / 2:
                start_index = 1
end_index = self.page_num + 1
else:
                start_index = self.current_page - (self.page_num - 1) / 2
end_index = self.current_page + (self.page_num + 1) / 2
if (self.current_page + (self.page_num - 1) / 2) > self.all_count():
                    end_index = self.all_count() + 1
start_index = self.all_count() - (self.page_num - 1)

        if int(self.current_page) == 1:
            prev = '<a class="page" href="javascript:void(0);">上一頁</a>'
else:
            prev = '<a class="page" href="%s?p=%s">上一頁</a>' % (base_url, self.current_page - 1)
        page_list.append(prev)

        for i in range(int(start_index), int(end_index)):
            if i == self.current_page:
                temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
            else:
                temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
            page_list.append(temp)

        if self.current_page == self.all_count():
            nex = '<a class="page" href="javascript:void(0);">下一頁</a>'
else:
            nex = '<a class="page" href="%s?p=%s">下一頁</a>' % (base_url, self.current_page + 1)
        page_list.append(nex)

        jump = '''
        <input type="text"/><a onclick='jumpTo(this, "%s?p=");'>GO</a>
        <script>
            function jumpTo(ths,base){
                 var val = ths.previousSibling.value;
                 location.href = base + val;
            }
        </script>
        ''' % (base_url,)
        page_list.append(jump)

        from django.utils.safestring import mark_safe
        page_str = "".join(page_list)
        page_str = mark_safe(page_str)
        # 為了防止XSS攻擊
return page_str

在views.py裡面這樣寫即可:

from utils import pagination

LIST = []
for i in range(1009):
    LIST.append(i)

def user_list(request):
    current_page = request.GET.get('p', 1)
    current_page = int(current_page)

    page_obj = pagination.Page(current_page, len(LIST))
    data = LIST[page_obj.start():page_obj.end()]
    page_str = page_obj.page_str("/user_list/")
    return render(request, 'user_list.html', {'li': data, 'page_str': page_str})

相關推薦

Django框架學習筆記19.定義

在講自定義分頁之前,先講一個簡單的。 在模板語言中還有一些特殊的存在,比如這個: def tpl4(request): name = "asdf123456" return render(request, 'tpl4.html', {'name': name})

Django框架學習筆記22.CSRF原理簡單介紹

前面我們寫Django的時候,都要在settings.py裡把CSRF註釋掉,這裡其實是Django提供的一層防護,防止提交的資料含有XSS攻擊,只有請求裡面含有CSRF令牌(隨機字串)才可以通過,否

Django框架學習筆記21.Session例項

基於Cookie做使用者驗證時:不適合把敏感資訊(如密碼)放在Cookie中,因為可以Cookie是可以看見的。 Cookie優勢:減輕了服務端的壓力 接下來介紹Session:     Cooki

Django框架學習筆記25.Form元件驗證

簡單的使用者註冊: urls.py加入: url(r'^fm/$', views.fm), views.py: from django import forms class FM(forms.

Django框架學習筆記9.ORM基本操作

app下的models.py: from django.db import models # Create your models here. class UserInfo(models.Mode

Django框架學習筆記28.檔案上傳詳解

1.所有美觀的上傳按鈕原理: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-

Django框架學習筆記4.簡單的總結

這裡對前面三節的知識做個簡單的總結: 一、基本操作: 1.建立Django工程:     django-admin startproject [工程名] 2.建立app:     cd [工程名]     python manage.py startapp [app名稱]

Django框架學習筆記16.利用ajax實現簡易的驗證

繼續上一篇的例子: host.html: <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html"> <head> <meta charset=

Django框架學習筆記14.一對多跨表操作

繼續上次的Django工程,在資料庫中加入一些資料: 在views.py加入: def host(request): v1 = models.Host.objects.filter(nid_

Django框架學習筆記27.Ajax簡單操作

原生Ajax: urls.py: url(r'^ajax/$', views.ajax), url(r'^ajax_json/$', views.ajax_json), views.py: de

Django框架學習筆記15.增加一對多資料簡易示例

在上一篇建立好的Django工程的基礎上: urls.py: from django.contrib import admin from django.urls import path from django.conf.urls import url from app01

莫比烏斯反演學習筆記轉載An_Account大佬

有一個 多人 rac 導出 公式 i++ 約數 n) 得出 轉載自An_Account大佬 提示:別用莫比烏斯反演公式,會炸的 只需要記住: [gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d)[g

潭州課堂25班:Ph201805201 django框架 第十二課 定義中介軟體,上下文處理,admin後臺 (課堂筆記)

中介軟體 在專案主目錄下的配置檔案 在專案主目錄下建立檔案 寫個自定義異常處理   方法1 要讓其生效,要在主目錄下,的中介軟體中進行註冊   主目錄下.該檔名.類名 在進入檢視函式之前進行判斷,  給 request 新增屬性   方法2  

Haskell語言學習筆記19File IO

副作用 才會 lose file 類型 ask pen 函數 有效 關於IO Action 類型為IO t。 運算時不執行,因而沒有任何效果,只有執行時才會有效果,產生副作用。 一個IO Action只有在其他IO Action中才能被執行。 類型為IO t的I

php laravel框架學習筆記 數據庫操作

true 數據 mar sql show top 一行 ati del 原博客鏈接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通過配置環境變量,使用cmd進入mysql,當然還有一種東

CSS學習筆記三:定義單選框,復選框,開關

sla checked 移動 transform 第一個 16px 位移 block back 一點一點學習CCS,這次學習了如何自定義單選框,復選框以及開關。 一、單選框 1、先寫好body裏面的樣式,先寫幾個框 1 <body> 2 <d

Linux學習筆記19

19一、壓縮打包介紹壓縮完的文件可以節省空間,網絡傳輸時間變短,網絡帶寬耗費資源變小windows常見壓縮文件:rar zip 7zlinux常見壓縮文件 zip .gz .bz2 .xz .tar (後綴名只是一個約定) 壓縮的越狠,耗費的cpu資源越大二、gzip解壓工具 (不能壓縮

Spring框架學習筆記

約束 存在 基礎 核心 但是 註解 文件的 分享 strong 上接Spring框架學習筆記(一) IOC和DI區別 (1)IOC: 控制反轉,把對象創建交給spring進行配置 (2)DI: 依賴註入,向類裏面的屬性中設置值 (3)關系:依賴註入不能單獨存在,需要在i

Spring框架學習筆記

兩個 低版本 事務管理器 對象關系 多行 通配符 表單 spring整合 val 上接Spring框架學習筆記(三) 聲明式事務管理(xml配置) 1 配置文件方式使用aop思想配置 第一步 配置事務管理器 第二步 配置事務增強 第三步 配置切面 聲明式事務

Django學習手冊 - 初識定義

request shortcut ren 字符 span turn 翻頁 info char 核心: <a href=‘http://127.0.0.1:8000/index-%s‘>%s<a> 自定義分頁 1.前端處理字符   後端的字符