vkill'blog

“技术本身没有太多价值,掌握了新的思考方式才是真的收获”

django 中使用 tag 来完善分页视图中的 上一页、下一页

18:39 , vkill
关于分页视图中使用分页栏google很多文章,讲到的方法中,如果地址栏中有 ?a=1 这样的querystring,那么就很不好办,这里自己写了个tag来处理了下,没这个问题了
bs 下,django的template太烂的,解决这么个简单问题还需要写那么长个tag,实在不爽中。。。

tag如下:

#app_xx/templatetags/add_page_to_path_tag.py
from django.template import Library, Node, TemplateSyntaxError
from urlparse import urlparse, urlunparse
import re

register = Library()

class AddPageToPathNode(Node):
    def __init__(self, request, page):
        self._request = request.encode()
        self._page = page.encode()
        
    def render(self, context):
        self.full_path = context[self._request].get_full_path()
        if self._page == 'first':
            self.page = 1
        elif self._page == 'last':
            self.page = context['pages']
        else:
            self.page = context[self._page]
            
        url = urlparse(self.full_path)
        r1 = re.compile(r"\?")
        r2 = re.compile(r"page=\d+")
        if r1.search(self.full_path):
            if r2.search(self.full_path):
                return r2.sub('page=%s' % self.page, urlunparse(url))
            else:
                return "%s&page=%s" % (self.full_path, self.page)
        else:
            return "%s?page=%s" % (self.full_path, self.page)

def add_page_to_path(parser, token):
    tokens = token.split_contents()
    if len(tokens) < 3:
        raise TemplateSyntaxError(u"'%r' tag requires at least 2 arguments." % tokens[0])
    return AddPageToPathNode(tokens[1], tokens[2])

register.tag('add_page_to_path', add_page_to_path)



template中使用如下:

#app_xx/templates/include/paginate.html
{% load add_page_to_path_tag %}

<div style="text-align:right; padding-right: 20px">
    {% if is_paginated %}
        {% ifequal page 1 %}
                 首页
        {% else %}
                <a href="{% add_page_to_path request first %}">首页</a>
        {% endifequal %}
        {% if has_previous %}
               <a href="{% add_page_to_path request previous %}">上一页</a>
        {% else %}
               上一页
        {% endif %}
        {% if has_next %}
               <a href="{% add_page_to_path request next %}">下一页</a>
        {% else %}
               下一页
        {% endif %}
        {% ifequal page pages %}
                末页
         {% else %}
               <a href="{% add_page_to_path request pages %}">末页</a>
         {% endifequal %}
    &nbsp;当前页:{{ page }}/{{ pages }}
    {% endif %}
</div>

类别:python & django | Tags: , , , | 1 条评论, 2039 次阅读
网友评论(1):
胡阳
Email Homepage
2012/01/13 11:20
过来学习了
Pages: 1/1 First page 1 Final page
发表评论:

Nickname: 
Email:
Site URI: