Django2.0在線教育網(wǎng)站開發(fā)(二)列表分頁功能

列表分頁庫

    1. 我們通過ddjango-pure-pagination這個(gè)庫來實(shí)現(xiàn)分頁功能,進(jìn)入虛擬環(huán)境執(zhí)行安裝以下命令。
      然后去settings.py文件里,注冊(cè)這個(gè)app:
'pure_pagination',

我們繼續(xù)下拉,看一下官方給的例子:

# views.py
from django.shortcuts import render_to_response

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger


def index(request):
    # 嘗試獲取頁數(shù)參數(shù)
    try:
        page = request.GET.get('page', 1)
    except PageNotAnInteger:
        page = 1
    # objects是取到的數(shù)據(jù)
    objects = ['john', 'edward', 'josh', 'frank']

    # 對(duì)取到的數(shù)據(jù)進(jìn)行分頁
    p = Paginator(objects, request=request)
    # 此時(shí)前臺(tái)顯示的就是我們此前獲取的第幾頁的數(shù)據(jù)
    people = p.page(page)

    return render_to_response('index.html', {
        'people': people,
    }

我們嘗試對(duì)照實(shí)現(xiàn):

# 課程機(jī)構(gòu)列表功能
class OrgView(View):
    def get(self, request):
        # 查找所有的城市信息
        all_citys = CityDict.objects.all()
        # 查找所有的課程機(jī)構(gòu)信息
        all_orgs = CourseOrg.objects.all()
        # 統(tǒng)計(jì)課程機(jī)構(gòu)的數(shù)量
        org_nums = all_orgs.count()
        # 對(duì)課程機(jī)構(gòu)進(jìn)行分頁,嘗試獲取前端get請(qǐng)求傳遞過來的page參數(shù)
        # 如果是不合法的配置參數(shù)則默認(rèn)返回第一頁
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        # 這里指從all_org中取五個(gè)出來,每頁顯示6個(gè),這個(gè)字段必填
        p = Paginator(all_orgs, 6, request=request) 

        orgs = p.page(page)

        return render(request, "org-list.html", {
            "all_citys": all_citys,
            "all_orgs": orgs,
            "org_nums": org_nums,
        })

查閱官方文檔吧!
往下拉,可以看到這段代碼,這就是官方文檔告訴我們?nèi)绾巫远x分頁樣式的:

{% load i18n %}
<div class="pagination">
    {% if page_obj.has_previous %}
        <a href="?{{ page_obj.previous_page_number.querystring }}" class="prev">&lsaquo;&lsaquo; {% trans "previous" %}</a>
    {% else %}
        <span class="disabled prev">&lsaquo;&lsaquo; {% trans "previous" %}</span>
    {% endif %}
    {% for page in page_obj.pages %}
        {% if page %}
            {% ifequal page page_obj.number %}
                <span class="current page">{{ page }}</span>
            {% else %}
                <a href="?{{ page.querystring }}" class="page">{{ page }}</a>
            {% endifequal %}
        {% else %}
            ...
        {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
        <a href="?{{ page_obj.next_page_number.querystring }}" class="next">{% trans "next" %} &rsaquo;&rsaquo;</a>
    {% else %}
        <span class="disabled next">{% trans "next" %} &rsaquo;&rsaquo;</span>
    {% endif %}
</div>

注意:這里面的page_obj其實(shí)就是我們的all_orgs!

下面我們繼續(xù)嘗試對(duì)照實(shí)現(xiàn),打開org-list.html頁面,找到對(duì)應(yīng)位置,復(fù)制官方文檔內(nèi)容,然后進(jìn)行替換(代碼格式化ctrl+alt+L):

<div class="pageturn">
                <ul class="pagelist">
                    {% if all_orgs.has_previous %}
                        <li class="long"><a href="?{{ all_orgs.previous_page_number.querystring }}">上一頁</a></li>
                    {% endif %}
                    {% for page in all_orgs.pages %}
                        {% if page %}
                            {% ifequal page all_orgs.number %}
                                <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
                            {% else %}
                                <li><a href="?{{ page.querystring }}">{{ page }}</a></li>
                            {% endifequal %}
                        {% else %}
                            <li class="none"><a href="">...</a></li>
                        {% endif %}
                    {% endfor %}
                    {% if all_orgs.has_next %}
                        <li class="long"><a href="?{{ all_orgs.next_page_number.querystring }}">下一頁</a></li>
                    {% endif %}
                </ul>
            </div>
城市分類的篩選
首先打開我們的organization/views.py文件,在里面添加如下數(shù)據(jù):
city_id = request.GET.get('city', '')
        # 選中了某個(gè)城市之后,根據(jù)城市Id與數(shù)據(jù)庫中的city_id進(jìn)行判斷(外鍵city在數(shù)據(jù)庫中名為city_id且為字符串類型)
        if city_id:
            all_orgs = all_orgs.filter(city_id=int(city_id))

return render(request, "org-list.html", {
            "city_id": city_id,
        })

然后打開org-list.html頁面,我們需要回傳我們的city_id并加以顯示出來:

<div class="cont">
          <a href="?ct="><span class="{% ifequal city_id '' %}active2{% endifequal %}">全部</span></a>   # 判斷是否選擇城市,如果沒有則顯示全部,并顯示加綠狀態(tài)
           {% for city in all_citys %}
           <a href="?city={{ city.id }}"><span class="{% ifequal city_id city.id|stringformat:"i" %}active2{% endifequal %}">{{ city.name }}</span></a> # 判斷是否選擇城市并顯示加綠狀態(tài)
           {% endfor %}
</div>
授課機(jī)構(gòu)排名

授課機(jī)構(gòu)排名就是圖片中右邊的那個(gè),我們根據(jù)課程機(jī)構(gòu)的點(diǎn)擊數(shù)來進(jìn)行排名:


55.png
 # 授課機(jī)構(gòu)的排名
        hot_orgs = all_orgs.order_by("click_nums")[:3]  # 返回的是一個(gè)QueryDict我們?nèi)∏叭齻€(gè)

然后我們?cè)趏rg-list.html頁面進(jìn)行修改代碼:

<div class="right companyrank layout">
            <div class="head">授課機(jī)構(gòu)排名</div>

            {% for current_org in hot_orgs %}
                <dl class="des">
                    <dt class="num fl">{{ forloop.counter }}</dt>
                    <dd>
                        <a href="/company/2/"><h1>{{ current_org.name }}</h1></a>
                        <p>{{ current_org.address }}</p>
                    </dd>
                </dl>
            {% endfor %}
        </div>

其中{{ forloop.counter }}是Django內(nèi)置的用于統(tǒng)計(jì)循環(huán)變量循環(huán)到第幾次的次數(shù)。
完成以后,我們?cè)賮硭⑿乱幌挛覀兊捻撁?,發(fā)現(xiàn)授課機(jī)構(gòu)排名沒有問題!

學(xué)習(xí)人數(shù)和課程人數(shù)排名
66.png

其實(shí)這個(gè)功能和前面介紹的幾個(gè)功能很相似,這里就簡(jiǎn)單介紹一下(步驟和前面的類似)
首先打開我們的organization/views.py文件,在里面添加如下數(shù)據(jù):

 # 學(xué)習(xí)人數(shù)和課程人數(shù)排名
        sort = request.GET.get('sort', '')
        if sort:
            if sort == "students":
                all_orgs = all_orgs.order_by("-students")
            elif sort == "courses":
                all_orgs = all_orgs.order_by("-course_nums")

return render(request, "org-list.html", {
            "sort": sort,
        })

然后我們?cè)趏rg-list.html頁面進(jìn)行修改代碼:

<ul class="tab_header">
<li class="{% if sort == '' %}active{% endif %}"><a href="?ct={{ category }}&city={{ city_id }}">全部</a> </li>
<li class="{% if sort == 'students' %}active{% endif %}"><a href="?sort=students&ct={{ category }}&city={{ city_id }}">學(xué)習(xí)人數(shù) &#8595;</a></li>
<li class="{% if sort == 'courses' %}active{% endif %}"><a href="?sort=courses&ct={{ category }}&city={{ city_id }}">課程數(shù) &#8595;</a></li>
</ul>

sort=students&ct={{ category }}&city={{ city_id }}和sort=courses&ct={{ category }}&city={{ city_id }}也是為了和前面的保持聯(lián)動(dòng)狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我從來不相信什么懶洋洋的自由,我向往的自由是通過勤奮和努力實(shí)現(xiàn)的更廣闊的人生,那樣的自由才是珍貴的、有價(jià)值的;我相...
    花房菇?jīng)龅哪切┗ㄊ?/span>閱讀 234評(píng)論 0 0
  • 泄露了數(shù)據(jù)庫密碼,用手機(jī)APP修改數(shù)據(jù)庫密碼。昨天在寫了一篇不寫一句mysql操作數(shù)據(jù)庫才是Python的風(fēng)格??!...
    Python之戰(zhàn)閱讀 573評(píng)論 0 2
  • 我們現(xiàn)在所處的時(shí)代,并不是那么和平,我們之所以看到的都是和平,因?yàn)樵谖覀兦胺?,有許許多多默默付出的人,把黑暗和戰(zhàn)爭(zhēng)...
    愚_95e2閱讀 276評(píng)論 0 1
  • 常用的插件:wow、Swiper、lightbox、fullpage wow使用步驟:第一步拷貝 wow.js a...
    楓123閱讀 388評(píng)論 0 1

友情鏈接更多精彩內(nèi)容