列表分頁庫
- 我們通過ddjango-pure-pagination這個(gè)庫來實(shí)現(xiàn)分頁功能,進(jìn)入虛擬環(huán)境執(zhí)行安裝以下命令。
然后去settings.py文件里,注冊(cè)這個(gè)app:
- 我們通過ddjango-pure-pagination這個(gè)庫來實(shí)現(xiàn)分頁功能,進(jìn)入虛擬環(huán)境執(zhí)行安裝以下命令。
'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">‹‹ {% trans "previous" %}</a>
{% else %}
<span class="disabled prev">‹‹ {% 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" %} ››</a>
{% else %}
<span class="disabled next">{% trans "next" %} ››</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)行排名:

# 授課機(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ù)排名

其實(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ù) ↓</a></li>
<li class="{% if sort == 'courses' %}active{% endif %}"><a href="?sort=courses&ct={{ category }}&city={{ city_id }}">課程數(shù) ↓</a></li>
</ul>
sort=students&ct={{ category }}&city={{ city_id }}和sort=courses&ct={{ category }}&city={{ city_id }}也是為了和前面的保持聯(lián)動(dòng)狀態(tài)。