美文网首页
Django2.0在线教育网站开发(二)列表分页功能

Django2.0在线教育网站开发(二)列表分页功能

作者: 书院十三 | 来源:发表于2019-04-08 21:48 被阅读0次

列表分页库

    1. 我们通过ddjango-pure-pagination这个库来实现分页功能,进入虚拟环境执行安装以下命令。
      然后去settings.py文件里,注册这个app:
'pure_pagination',

我们继续下拉,看一下官方给的例子:

# views.py
from django.shortcuts import render_to_response

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger


def index(request):
    # 尝试获取页数参数
    try:
        page = request.GET.get('page', 1)
    except PageNotAnInteger:
        page = 1
    # objects是取到的数据
    objects = ['john', 'edward', 'josh', 'frank']

    # 对取到的数据进行分页
    p = Paginator(objects, request=request)
    # 此时前台显示的就是我们此前获取的第几页的数据
    people = p.page(page)

    return render_to_response('index.html', {
        'people': people,
    }

我们尝试对照实现:

# 课程机构列表功能
class OrgView(View):
    def get(self, request):
        # 查找所有的城市信息
        all_citys = CityDict.objects.all()
        # 查找所有的课程机构信息
        all_orgs = CourseOrg.objects.all()
        # 统计课程机构的数量
        org_nums = all_orgs.count()
        # 对课程机构进行分页,尝试获取前端get请求传递过来的page参数
        # 如果是不合法的配置参数则默认返回第一页
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        # 这里指从all_org中取五个出来,每页显示6个,这个字段必填
        p = Paginator(all_orgs, 6, request=request) 

        orgs = p.page(page)

        return render(request, "org-list.html", {
            "all_citys": all_citys,
            "all_orgs": orgs,
            "org_nums": org_nums,
        })

查阅官方文档吧!
往下拉,可以看到这段代码,这就是官方文档告诉我们如何自定义分页样式的:

{% load i18n %}
<div class="pagination">
    {% if page_obj.has_previous %}
        <a href="?{{ page_obj.previous_page_number.querystring }}" class="prev">&lsaquo;&lsaquo; {% trans "previous" %}</a>
    {% else %}
        <span class="disabled prev">&lsaquo;&lsaquo; {% trans "previous" %}</span>
    {% endif %}
    {% for page in page_obj.pages %}
        {% if page %}
            {% ifequal page page_obj.number %}
                <span class="current page">{{ page }}</span>
            {% else %}
                <a href="?{{ page.querystring }}" class="page">{{ page }}</a>
            {% endifequal %}
        {% else %}
            ...
        {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
        <a href="?{{ page_obj.next_page_number.querystring }}" class="next">{% trans "next" %} &rsaquo;&rsaquo;</a>
    {% else %}
        <span class="disabled next">{% trans "next" %} &rsaquo;&rsaquo;</span>
    {% endif %}
</div>

注意:这里面的page_obj其实就是我们的all_orgs!

下面我们继续尝试对照实现,打开org-list.html页面,找到对应位置,复制官方文档内容,然后进行替换(代码格式化ctrl+alt+L):

<div class="pageturn">
                <ul class="pagelist">
                    {% if all_orgs.has_previous %}
                        <li class="long"><a href="?{{ all_orgs.previous_page_number.querystring }}">上一页</a></li>
                    {% endif %}
                    {% for page in all_orgs.pages %}
                        {% if page %}
                            {% ifequal page all_orgs.number %}
                                <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
                            {% else %}
                                <li><a href="?{{ page.querystring }}">{{ page }}</a></li>
                            {% endifequal %}
                        {% else %}
                            <li class="none"><a href="">...</a></li>
                        {% endif %}
                    {% endfor %}
                    {% if all_orgs.has_next %}
                        <li class="long"><a href="?{{ all_orgs.next_page_number.querystring }}">下一页</a></li>
                    {% endif %}
                </ul>
            </div>
城市分类的筛选
首先打开我们的organization/views.py文件,在里面添加如下数据:
city_id = request.GET.get('city', '')
        # 选中了某个城市之后,根据城市Id与数据库中的city_id进行判断(外键city在数据库中名为city_id且为字符串类型)
        if city_id:
            all_orgs = all_orgs.filter(city_id=int(city_id))

return render(request, "org-list.html", {
            "city_id": city_id,
        })

然后打开org-list.html页面,我们需要回传我们的city_id并加以显示出来:

<div class="cont">
          <a href="?ct="><span class="{% ifequal city_id '' %}active2{% endifequal %}">全部</span></a>   # 判断是否选择城市,如果没有则显示全部,并显示加绿状态
           {% for city in all_citys %}
           <a href="?city={{ city.id }}"><span class="{% ifequal city_id city.id|stringformat:"i" %}active2{% endifequal %}">{{ city.name }}</span></a> # 判断是否选择城市并显示加绿状态
           {% endfor %}
</div>
授课机构排名

授课机构排名就是图片中右边的那个,我们根据课程机构的点击数来进行排名:


55.png
 # 授课机构的排名
        hot_orgs = all_orgs.order_by("click_nums")[:3]  # 返回的是一个QueryDict我们取前三个

然后我们在org-list.html页面进行修改代码:

<div class="right companyrank layout">
            <div class="head">授课机构排名</div>

            {% for current_org in hot_orgs %}
                <dl class="des">
                    <dt class="num fl">{{ forloop.counter }}</dt>
                    <dd>
                        <a href="/company/2/"><h1>{{ current_org.name }}</h1></a>
                        <p>{{ current_org.address }}</p>
                    </dd>
                </dl>
            {% endfor %}
        </div>

其中{{ forloop.counter }}是Django内置的用于统计循环变量循环到第几次的次数。
完成以后,我们再来刷新一下我们的页面,发现授课机构排名没有问题!

学习人数和课程人数排名
66.png

其实这个功能和前面介绍的几个功能很相似,这里就简单介绍一下(步骤和前面的类似)
首先打开我们的organization/views.py文件,在里面添加如下数据:

 # 学习人数和课程人数排名
        sort = request.GET.get('sort', '')
        if sort:
            if sort == "students":
                all_orgs = all_orgs.order_by("-students")
            elif sort == "courses":
                all_orgs = all_orgs.order_by("-course_nums")

return render(request, "org-list.html", {
            "sort": sort,
        })

然后我们在org-list.html页面进行修改代码:

<ul class="tab_header">
<li class="{% if sort == '' %}active{% endif %}"><a href="?ct={{ category }}&city={{ city_id }}">全部</a> </li>
<li class="{% if sort == 'students' %}active{% endif %}"><a href="?sort=students&ct={{ category }}&city={{ city_id }}">学习人数 &#8595;</a></li>
<li class="{% if sort == 'courses' %}active{% endif %}"><a href="?sort=courses&ct={{ category }}&city={{ city_id }}">课程数 &#8595;</a></li>
</ul>

sort=students&ct={{ category }}&city={{ city_id }}和sort=courses&ct={{ category }}&city={{ city_id }}也是为了和前面的保持联动状态。

相关文章

  • Django2.0在线教育网站开发(二)列表分页功能

    列表分页库 我们通过ddjango-pure-pagination这个库来实现分页功能,进入虚拟环境执行安装以下命...

  • 3、常数项分类列表加分页功能

    目标 列表功能 分页功能 列表功能 第一步,添加成功跳转到列表页 第二步 添加路由地址定义: 第三步 开发列表页 ...

  • 十二、MyBatis实现分页功能

    一、本课目标 掌握MyBatis分页实现 二、MyBatis分页功能实现 需求说明: 为用户管理之查询用户列表功能...

  • javascript实现分页效果

    网站分页功能是必不可少的,一般用在列表页面中,javascript实现分页效果,效果如下: 实现代码 html结构...

  • 分页设计的难点问题

    在网站开发、移动 APP 开发的时候,遇到数据量多的时候,都会有人性化的分页功能。但是,看似简单的分页功能,其实存...

  • django项目--新闻主页

    新闻主页 一、功能需求分析 1.功能 轮播图 推荐文章列表 文章标签导航 文章列表 分页 二、模型设计 根据功能分...

  • 4、列表加分页功能

    目标 列表功能 分页功能 列表功能 第一步 新增加FindAllUser.vue文件 第二步 添加路由地址定义: ...

  • 0.利用Django2.0搭建个人博客网站系列教程0

    本教程来源于:B站杨仕航Django2.0开发视频教程,如需转载,必须注明来源! 个人博客网站设计功能框架如下:

  • (14)Django - 分页功能

    Django已为开发者内置了分页功能,只需调用Django内置分页功能的函数即可实现数据分页功能。我们在Djang...

  • 【开发进度】整体index

    【功能定义】网站构思 【登陆功能】开发guide 【TODO】任务列表 【工具类】定义 【实体类】定义 用户相关实...

网友评论

      本文标题:Django2.0在线教育网站开发(二)列表分页功能

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