django和flask分頁
前言
最近搞了一些關于flask和django的東西,尤其是django的模板和admin功能以及這些框架使用bootstrap的東西,沒時間更新博客,先說一下flask和django分頁吧
flask的bootstrap分頁插件flask-paginate
其實安裝很常規,他的思路就是根據你的數據量給每個頁面加一個li前綴到最后返回的div里面。因為官網提供的說明很簡單,我在這里仔細說說:
-
官網說給你的網站頁面添加css:
.pagination-page-info {
padding: .6em;
padding-left: 0;
width: 40em;
margin: .5em;
margin-left: 0;
font-size: 12px;
}
.pagination-page-info b {
color: black;
background: #6aa6ed;
padding-left: 2px;
padding: .1em .25em;
font-size: 150%;
}
其實這個是給你頁面顯示統計數據的方法pagination.info提供的樣式,默認的class=’pagination’是bootstrap自帶的,不需要你添加
2. 官網的例子使用的是:Blueprint:
我們一般都是: ‘from flask import Flask’,其實Blueprint就是一個可定制的容器,一個應用可以有多個容器,他們都繼承于flask.helpers._PackageBoundObject
可以看我的一個例子:
@app.route(‘/‘)
def index():
pagesize = 100 #設定每頁顯示條目數
page = int(request.args.get(‘page’,0)) #獲取當前頁面頁數
data = get_MongoData(page, pagesize) #get_MongoData是我自己的函數,根據頁數過濾要顯示的數據(因為實在太大了)
pagination = Pagination(total=data[1], per_page=pagesize, page=page) #total的值是總數據條目,per_page表示每頁顯示數目,page就是當前頁數。還可以設置向前/后頁面標簽(默認是<</>>)等
return render_template(“index.html”, pagination=pagination)
</code></pre>
-
我對他的一點修改:
- 我發現在我的程序里面,這個分頁欄在后部會放不下而換行顯示,我就直接把link_css制定的div改成了行內元素span
-
當我默認使用link_size,代碼是這樣:
link_css = ‘ <span> <ul> <p>‘</p> <p>其實最后頁面出來的效果是’</p> </ul> </span> 這樣就沒有符合的bootstrap類,所以我修改了links方法:
@property
def links(self):
‘’’get all the pagination links’’’
if self.total_pages <= 1:
return ‘’
if not self.link_size:
self.link_size = ‘’
s = [link_css.format(self.link_size)]
s.append(self.prev_page)
for page in self.pages:
s.append(self.single_page(page) if page else gap_marker)
s.append(self.next_page)
s.append(‘‘)
return ‘’.join(s)
</code></pre>
</li>
</ol> </li>
</ol>
flask的bootstrap分頁插件 django-bootstrap-pagination
django的插件比較復雜,它自己定義了中間件和標簽,這樣你需要在模板中load它提供的函數,并且很nb的使用了RequestContext去處理變量.
-
先看我的后臺方法:
def showlist(req):
t = req.GET.get(‘type’, None)
l = req.GET.get(‘app’, None)
if t and l:
db = getMongo(‘XXX.XXX.XXX.XXX:XX’, ‘dc2’)
if t == ‘v’:
q = re.compile(r’.*%s$’ % l)
data = db.site.find({‘modules.site.level’:’v4’, ‘site’:{ ‘$regex’ : q }},
{‘site’:1, ‘_id’:0, ‘modules.site.links’:1, ‘modules.site.keywords’:1}).sort(
‘modules.site.site.check_time’)
return render_to_response(“list.html”, {‘data’:data}, context_instance=RequestContext(req))
</code></pre>
但是運行時候會報錯:
Traceback:
File “/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py” in get_response
- response = callback(request, callback_args, **callback_kwargs)
File “/home/dongwm/centerCon/views.py” in showlist
- return render_to_response(“list.html”, {‘data’:data}, context_instance=RequestContext(req))
File “/usr/local/lib/python2.6/dist-packages/django/shortcuts/init.py” in render_to_response
- return HttpResponse(loader.render_to_string(args, kwargs), httpresponse_kwargs)
File “/usr/local/lib/python2.6/dist-packages/django/template/loader.py” in render_to_string
- return t.render(context_instance)
File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render
- return self._render(context)
File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in _render
- return self.nodelist.render(context)
File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render
- bit = self.render_node(node, context)
File “/usr/local/lib/python2.6/dist-packages/django/template/debug.py” in render_node
- return node.render(context)
File “/home/dongwm/centerCon/templatetags/pagination_tags.py” in render
- page_obj = paginator.page(context[‘request’].page)
File “/usr/local/lib/python2.6/dist-packages/django/template/context.py” in getitem
- raise KeyError(key)
Exception Type: KeyError at /showlist/
Exception Value: ‘request’
</code></pre>
不管你用那個插件都會有這個報錯。。。
后來發現原因是:
settings文件沒有設置TEMPLATE_CONTEXT_PROCESSORS
理由:模板上下文處理器會指定了哪些contextprocessors總是默認被使用。這樣就省去了每次使用RequestContext都指定processors的麻煩
在settings加入:
TEMPLATE_CONTEXT_PROCESSORS = (
“django.core.context_processors.media”,
“django.core.context_processors.request”
)
來自:http://www.dongwm.com/2012/12/29/djangohe-flaskfen-ye/