• Django 中如何针对自定义的 View 做分页显示


    参考:http://www.obeattie.com/blog/posts/custom-view-pagination-django/
    http://www.djangoproject.com/documentation/models/pagination/

    在上述链接的资料中,核心的分页逻辑代码如下:

    # demo Model
    class Tag(models.Model):
        name 
    = models.CharField('Tag Name', maxlength=200)
        slug 
    = models.SlugField(prepopulate_from=('name', ))

        
    def __str__(self):
            
    return self.name


    from django.core.paginator import ObjectPaginator, InvalidPage

    # demo View
    def tag_list(request):
        tags 
    = Tag.objects.order_by('name')
        paginator 
    = ObjectPaginator(tags, 5)

        
    try
            page 
    = int(request.GET.get('page''1'))
            tags 
    = paginator.get_page(page - 1)

        
    except InvalidPage: 
            
    raise http.Http404

        
    return shortcuts.render_to_response("tag_list.html", { 
        
    'paginator': paginator,
        
    'tags': tags,
        
    'is_paginated': paginator.pages > 1,
        
    'has_next': paginator.has_next_page(page - 1),
        
    'has_previous': paginator.has_previous_page(page - 1),
        
    'current_page': page,
        
    'next_page': page + 1,
        
    'previous_page': page - 1,
        
    'pages': paginator.pages,
        
    'hits' : paginator.hits,
        }, 
        context_instance 
    = RequestContext(request))

    参考以上代码,为了配合这个 view, 我写了个简单的 template 显示分页链接:

                    {% if is_paginated %}
                        {% ifequal current_page 1 %}|
    < 
                        {% else %} 
    <href="?page=1">|&lt;</a>
                        {% endifequal %}
                        {% if has_previous %} 
    <href="?page={{ previous_page }}">&lt;&lt;</a>
                        {% else %} 
    &lt;&lt;
                        {% endif %}
                        {% for p in page_numbers %}
                            
    <href="?page={{ p }}">{{ p }}</a>
                        {% endfor %}
                        {% if has_next %}
    <href="?page={{ next_page }}">&gt;&gt;</a>
                        {% else %}
    &gt;&gt;
                        {% endif %}
                        {% ifequal current_page pages %}
    &gt;|
                        {% else %} 
    <href="?page={{ pages }}">&gt;|</a>
                        {% endifequal %}
                        
    &nbsp;&nbsp;
                        当前页:{{ current_page }}/{{ pages }}
                        
    &nbsp;&nbsp;
                    {% endif %}              
                    共{{ hits }}个话题

    另外,为了在模板中输出所有页码的链接,我给 render_to_response 的 context 字典变量增加了一个值:

    'page_numbers': range(paginator.pages+1)[1:],

    这样,一个功能齐全的分页代码就完成了。当然还可以在这个基础上修改一下,加入其他高级的分页功能。比如像 google 那样每次只显示10页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。

  • 相关阅读:
    [java,2019-01-28] 枪手博弈,谁才是最后赢家
    [java,2019-01-25] 图片和二进制互转
    [java,2019-01-15] word转pdf
    [python,2018-06-29] 37%法则及其拓展解决恋爱问题
    [java,2018-06-26] 扑克牌抽牌求和问题
    [python,2018-06-25] 高德纳箭号表示法
    [java,2017-06-12] myEclipse双击无法打开文件
    OpenGL核心技术之法线贴图
    游戏中水的渲染技术系列一
    Unity 3D实现帧同步技术
  • 原文地址:https://www.cnblogs.com/RChen/p/django_pagination.html
Copyright © 2020-2023  润新知