django和flask分頁

brnw7836 8年前發布 | 14K 次閱讀 Django Flask Python開發

前言

最近搞了一些關于flask和django的東西,尤其是django的模板和admin功能以及這些框架使用bootstrap的東西,沒時間更新博客,先說一下flask和django分頁吧

flask的bootstrap分頁插件flask-paginate

其實安裝很常規,他的思路就是根據你的數據量給每個頁面加一個li前綴到最后返回的div里面。因為官網提供的說明很簡單,我在這里仔細說說:

  1. 官網說給你的網站頁面添加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>

  1. 我對他的一點修改:

    1. 我發現在我的程序里面,這個分頁欄在后部會放不下而換行顯示,我就直接把link_css制定的div改成了行內元素span
    2. 當我默認使用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去處理變量.

      1. 先看我的后臺方法:

       

      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

      1. response = callback(request, callback_args, **callback_kwargs) File “/home/dongwm/centerCon/views.py” in showlist
      2. 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
      3. 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
      4. return t.render(context_instance) File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render
      5. return self._render(context) File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in _render
      6. return self.nodelist.render(context) File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render
      7. bit = self.render_node(node, context) File “/usr/local/lib/python2.6/dist-packages/django/template/debug.py” in render_node
      8. return node.render(context) File “/home/dongwm/centerCon/templatetags/pagination_tags.py” in render
      9. page_obj = paginator.page(context[‘request’].page) File “/usr/local/lib/python2.6/dist-packages/django/template/context.py” in getitem
      10. 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/

       

 本文由用戶 brnw7836 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!