django和flask分页

brnw7836 8年前
   <h3><strong>前言</strong></h3>    <p>最近搞了一些关于flask和django的东西,尤其是django的模板和admin功能以及这些框架使用bootstrap的东西,没时间更新博客,先说一下flask和django分页吧</p>    <h3><strong>flask的bootstrap分页插件flask-paginate</strong></h3>    <p>其实安装很常规,他的思路就是根据你的数据量给每个页面加一个li前缀到最后返回的div里面。因为官网提供的说明很简单,我在这里仔细说说:</p>    <ol>     <li> <p>官网说给你的网站页面添加css:</p> </li>    </ol>    <p> </p>    <pre>  <code class="language-python">.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%;  }  </code></pre>    <p> </p>    <p>其实这个是给你页面显示统计数据的方法pagination.info提供的样式,默认的class=’pagination’是bootstrap自带的,不需要你添加</p>    <p>2. 官网的例子使用的是:Blueprint:</p>    <p>我们一般都是: ‘from flask import Flask’,其实Blueprint就是一个可定制的容器,一个应用可以有多个容器,他们都继承于flask.helpers._PackageBoundObject</p>    <p>可以看我的一个例子:</p>    <p> </p>    <pre>  <code class="language-python">@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>    <ol>     <li> <p>我对他的一点修改:</p>      <ol>       <li>我发现在我的程序里面,这个分页栏在后部会放不下而换行显示,我就直接把link_css制定的div改成了行内元素span</li>       <li> <p>当我默认使用link_size,代码是这样:</p> link_css = ‘ <span> <ul> <p>‘</p> <p>其实最后页面出来的效果是’</p> </ul> </span> <p>这样就没有符合的bootstrap类,所以我修改了links方法:</p> <p> </p> <pre>  <code class="language-python"> @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> <p> </p> </li>      </ol> </li>    </ol>    <h3><strong>flask的bootstrap分页插件 django-bootstrap-pagination</strong></h3>    <p>django的插件比较复杂,它自己定义了中间件和标签,这样你需要在模板中load它提供的函数,并且很nb的使用了RequestContext去处理变量.</p>    <ol>     <li> <p>先看我的后台方法:</p> </li>    </ol>    <p> </p>    <pre>  <code class="language-python">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>    <p>但是运行时候会报错:</p>    <p> </p>    <pre>  <code class="language-python">Traceback:  File “/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py” in get_response    111.                         response = callback(request, callback_args, **callback_kwargs)  File “/home/dongwm/centerCon/views.py” in showlist    68.     return render_to_response(“list.html”, {‘data’:data}, context_instance=RequestContext(req))  File “/usr/local/lib/python2.6/dist-packages/django/shortcuts/<strong>init</strong>.py” in render_to_response    20.     return HttpResponse(loader.render_to_string(args, <strong>kwargs), </strong>httpresponse_kwargs)  File “/usr/local/lib/python2.6/dist-packages/django/template/loader.py” in render_to_string    176.         return t.render(context_instance)  File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render    140.             return self._render(context)  File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in _render    134.         return self.nodelist.render(context)  File “/usr/local/lib/python2.6/dist-packages/django/template/base.py” in render    823.                 bit = self.render_node(node, context)  File “/usr/local/lib/python2.6/dist-packages/django/template/debug.py” in render_node    74.             return node.render(context)  File “/home/dongwm/centerCon/templatetags/pagination_tags.py” in render    91.             page_obj = paginator.page(context[‘request’].page)  File “/usr/local/lib/python2.6/dist-packages/django/template/context.py” in <strong>getitem</strong>    54.         raise KeyError(key)    Exception Type: KeyError at /showlist/  Exception Value: ‘request’  </code></pre>    <p>不管你用那个插件都会有这个报错。。。</p>    <p>后来发现原因是:</p>    <p>settings文件没有设置TEMPLATE_CONTEXT_PROCESSORS</p>    <p>理由:模板上下文处理器会指定了哪些contextprocessors总是默认被使用。这样就省去了每次使用RequestContext都指定processors的麻烦</p>    <p>在settings加入:</p>    <p>TEMPLATE_CONTEXT_PROCESSORS = (</p>    <p>“django.core.context_processors.media”,</p>    <p>“django.core.context_processors.request”</p>    <p>)</p>    <p> </p>    <p>来自:http://www.dongwm.com/2012/12/29/djangohe-flaskfen-ye/</p>    <p> </p>