美文网首页
Django: 分页功能

Django: 分页功能

作者: 泠泠七弦客 | 来源:发表于2016-08-24 13:45 被阅读0次

    成果:


    将之前爬取的信息罗列出来,做出分页的样式

    代码:
    在之后的步骤中在相信说明吧

    步骤:

    1.这个mongoengine需要pip安装的pip install mongoengine命令即可实现
    建立与数据库的链接,connect的第一个参数是数据库的名称

    先是在setting中加入数据
    2.在第一步之后,在models中
    from django.db import models
    from mongoengine import *
    # from mongoengine import connect
    # connect('ceshi', host='127.0.0.1', port=27017)
    # Create your models here.
    
    
    class ItemInfo(Document):
        # StringField()的意思就是字符串
        title = StringField()
        # ListField的意思就是列表化一下
        area = ListField(StringField())
        pub_date = StringField()
        look = StringField()
        url = StringField()
        cates = ListField(StringField())
        time = StringField()
        price = StringField()
    
    meta = {
        'collection': 'item_info',
    }
    # 亲测可用
    # for i in ItemInfo.objects[:1]:
    #     print(i.title)
    

    我个人的理解是初始化数据库,这个是数据库事先存在的情况下,与数据库建立连接。而且在class中,每一项右侧都要跟数据库的key一致(必须一样,如果不一致就报错了)
    可以看到,在前后注释掉的东西可以用来验证是否成功
    3.在view.py中
    需要导入这个类
    from ganji.models import ItemInfo

    def index(request):
        limit = 4
        # 取出20个元素
        item_info = ItemInfo.objects[:1]
        # 下面的语句跟上面语句等价,但是为什么索引在这里
        # 仿佛失效的样子
        # item_info = ItemInfo.objects.all()
    
        # 分页器,前面是总共的元素,limit是每页的元素个数
        paginator = Paginator(item_info, limit)
        print('页码数量', paginator.num_pages)
    
        # 从页面获取页数信息,这里是获取?后参数page的value,
        # 可以看到get后的‘page’并不是我们定义的,而是我们获取的
        # 它的值就是个int
        page = request.GET.get('page', 1)
    
        # 显示某‘page’页面的信息
        loaded = paginator.page(page)
    
        # print('这里是loaded', loaded)
        print('page_range', paginator.page_range)
        context = {
            'item_info': loaded,
        }
    
        # context是关键字,传入字典,但是这个字典的key才是在HTML中用到的
        # 这点跟flask不一样,flask是随便定义user=user,左边是模板中的,右边是views中的
        return render(request, 'index.html', context)
    

    4.同时在HTML文件中
    写入信息,用循环既可,这点跟jinja2很相似,但是需要注意的是:
    我们用的是context的key,并不是context本身

    {% for item in item_info %}
        <section class="post">
            <header class="post-header">
                <h2 class="post-title">{{ item.title }}</h2>
                <p class="post-meta">
                    {% for cate in item.cates %}
                    <a class="post-category post-category-design" href="#">{{ cate }}</a>
                    {% endfor %}
                     <br>
                     <br>
                    {% for a in item.area %}
                    <a class="post-category post-category-pure" href="#">{{ a }}</a>
                    {% endfor %}
                </p>
            </header>
            <div class="post-description">
                <p>
                    ¥{{ item.price }}---{{ item.pub_date }}
                </p>
            </div>
        </section>
    {% endfor %}
    

    5.分页器
    在views视图函数中导入本次的重点--分页器(详细资料点击查看)
    from django.core.paginator import Paginator
    需要在HTML中特意做出来这个分页器。
    其原理是:显示页码,当点击上一页下一页的时候,会自动给视图函数传参数,然后根据这个参数,返回数据给HTML渲染

    <div class="footer">
        <div class="pure-menu pure-menu-horizontal">
            <ul>
               <li class="pure-menu-item"><a href="?page=1" class="pure-menu-link">首页</a></li>
               {% if item_info.has_previous %}
                   <li class="pure-menu-item"><a href="?page={{ item_info.previous_page_number }}" class="pure-menu-link">< pre</a></li>
               {% endif %}
                   <li class="pure-menu-item"><span> {{ item_info.number }} of {{ item_info.paginator.num_pages }}</span></li>
               {% if item_info.has_next %}
                   <li class="pure-menu-item"><a href="?page={{ item_info.next_page_number }}" class="pure-menu-link">next ></a></li>
               {% endif %}
               <li class="pure-menu-item"><a href="?page={{ item_info.paginator.num_pages }}" class="pure-menu-link">尾页</a></li>
            </ul>
        </div>
    </div>
    

    其中用到了很多函数,可以查看分页器的详细介绍

    新技能GET:

    1.分页器--http://python.usyiyi.cn/django/topics/pagination.html
    2.流程是:
    setting中注册数据库->models中引入数据库->views中使用数据库->最终用数据库渲染

    遇到的坑:

    1.在models中引入数据库的时候
    class ItemInfo(Document):
    其中的对象是以大写字母D开头的Document
    2.在views.py中,item_info = ItemInfo.objects[:1]是复数的objects,复数!

    疑问未决:

    如图,第十行的代码中索引好像完全不起作用,无论改为多少,都能在第15行初始化中加载所有的object!而在11行print(item_info)中还是1,到16行就已经是所有数据都加载进去了!!


    就是这个问题

    相关文章

      网友评论

          本文标题:Django: 分页功能

          本文链接:https://www.haomeiwen.com/subject/ftznsttx.html