首页 > django 表单分页代码

django 表单分页代码

期望实现分页如下:

自定义类实现分页

class Spagination(object):
    def __init__(self, total, page=1, perpage=5):
        self.total = total
        self.pages = self.total / perpage + 1 if (self.total % perpage) > 0 else self.total / perpage

        self.page = page
        self.perpage = perpage

        if page > 1:
            self.prev_num = page -1
        else:
            self.prev_num = None

        if page*perpage < total:
            self.next_num = page +1
        else:
            self.next_num = None

        if self.prev_num:
            self.has_prev = True
        else:
            self.has_prev = False

        if self.next_num:
            self.has_next = True
        else:
            self.has_next = False

        self.visible_pages = self.iter_pages()

    def prev(self):
        if self.prev_num:
            return Spagination(self.total, page=self.page-1, perpage=self.perpage)
        raise 'There is no prev page!'

    def next(self):
        if self.next_num:
            return Spagination(self.total, page=self.page+1, perpage=self.perpage)
        raise 'There is no next page!'

    def iter_pages(self, left_edge=1, right_edge=1, all=2):
        left_list, right_list = [], []

        for p in range(1,left_edge):
            if self.page - p > 0:
                left_list.insert(0, self.page - p)

        for p in range(1,right_edge):
            if self.page + p <= self.pages:
                right_list.append(self.page + p)

        if len(left_list) < left_edge and right_list:
            for i in range(all-len(left_list)-len(right_list)-1):
                if right_list[-1]+1 <= self.pages:
                    right_list.append(right_list[-1]+1)

        if len(right_list) < right_edge and left_list:
            for i in range(all-len(left_list)-len(right_list)-1):
                if left_list[0]-1 > 0:
                    left_list.insert(0, left_list[0]-1)

        return left_list+[self.page]+right_list

    def setItems(self, items):
        self.items = items

    @classmethod
    def wraper(cls, objs, limit, current_page):
        paginator = Paginator(objs, limit)
        items = paginator.page(current_page)

        pagin = Spagination(paginator.count, current_page, limit)
        pagin.setItems(items)
        return pagin

查询集合

    def get_queryset(self):
        self.page = int(self.request.GET.get('page', 1))
        \\\
              properties=Property.objects.filter(kw_q,province_q,city_q,area_q,active=True)
        per_page = 5
        p = Paginator(properties, per_page)
        pagin = Spagination.wraper(properties, per_page, self.page)
        return pagin

template web页面

            <ul class="pagination">
                    {% if pagin.has_prev %}
                        <a href="javascript:void(0)" page="{{pagin.prev_num}}" ><span>&lt;</span></a>
                    {% endif %}
                    <a href="javascript:void(0)" page="1" {%if pagin.page == 1%}class="current_page"{%endif%}>|&lt;</a>
                    {% for p in pagin.visible_pages %}
                        {% if p != 1 and p != pagin.pages %}
                            <a href="javascript:void(0)" page="{{ p }}" {%if pagin.page == p %}class="current_page"{%endif%}>{{p}}</a>
                        {% endif %}
                    {% endfor %}
                    <a href="javascript:void(0)" page="{{ pagin.pages }}" {%if pagin.page == pagin.pages%}class="current_page"{%endif%}><span>&gt;|</span></a>
                    {% if pagin.has_next %}
                        <a href="javascript:void(0)" page="{{pagin.next_num}}"><span>&gt;</span></a>
                    {% endif %}

            </ul>

1、queryset 返回值不应为空,实际上为空。
2、页码显示结果:

不知问题出现在(=@__@=)哪里?


你首先要保证Property.objects.filter(kw_q,province_q,city_q,area_q,active=True)查询出来是有数据的,如果没有数据分页就没意义了,然后代码这样写

def get_queryset(self):
    self.page = int(self.request.GET.get('page', 1))
    limit = 5
    properties=Property.objects.filter(kw_q,province_q,city_q,area_q,active=True)
    pagin = Spagination.wraper(properties, limit, self.page)
    return pagin
【热门文章】
【热门文章】