Django - 分页显示博客和shell命令行模式

快速添加博客

  • shell命令行模式添加博客 :
  1. python manage.py shell
  2. for 循环执行新增博客代码

shell命令行添加博客

# 引入博客
>>> from blog.models import Blog
# 添加标题
>>> blog.title = "shell下第一篇博客"
# 添加内容
>>> blog.content = "XXXXXXXxxxxxxxxx"
# 引入博客类型
>>> from blog.models import BlogType
# 创建博客类型实例
>>> blogtype = BlogType()
# 获取第一个博客类型, 并赋值给blog_type变量
>>> blog_type = BlogType.objects.all()[0]
# 添加博客类型
>>> blog.blog_type = blog_type
# 引入django里面的user类
>>> from django.contrib.auth.models import User
# 获取第一个user
>>> user = User.objects.all()[0]
# 添加作者
>>> blog.author = user
# 保存
>>> blog.save()
# 查询所有博客
>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 第一篇博客>>, <Blog: <Blog: 第二篇博客>>, <Blog: <Blog: 第三篇随笔>>, <Blog: <Blog: shell下第一篇博客>>]>

for 循环添加博客

>>> for i in range(1, 31):
		blog = Blog()
		blog.title = "for %s" % i
		blog.content = "xxxxx:%s" % i
		blog.blog_type = blog_type
		blog.author = user
		blog.save()

分页

  • 导入Django里面的分页器 :
    • from django.core.paginator import Paginator
  • 实例化, 第一个参数是需要分类的列表, 第二个是一页多少篇文章
    • paginator = Paginator(object_list, each_page_count)
  • 具体页面
    • page1 = paginator.page(1)

博客分页

>>> blogs = Blog.objects.all()
>>> paginator = Paginator(blogs, 10)
<string>:1: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'blog.models.Blog'> QuerySet.
>>>
  • 这里出现一个提醒, 是因为没有给模型一个默认的排序. 需要在模型指定一个排序规则
class Meta:
        ordering = ['-created_time']
  • 创建迁移文件并同步数据库
    • python manage.py makemigrations
    • python manage.py migrate

分页的使用

修改views方法

  • request.GET.get(‘page’, 1) : 获取get请求url参数里面的页码参数, request.GET返回的是一个字典.
  • paginator.get_page(page_num) : 根据页码获取具体的页面
# 博客列表
# 博客列表
def blog_list(request):
    blogs_all_list = Blog.objects.all()
    # 创建分页器, 每10页分页
    paginator = Paginator(blogs_all_list, 10)
    # 获取get请求url里面的页码参数
    page_num = request.GET.get('page', 1)
    # 根据页码获取模型的QuerySet, 给定模型的对象列表 
    page_of_blogs = paginator.get_page(page_num)
    for page in page_of_blogs.object_list:
        print("----",page.title)
    context = {}
    context['page_of_blogs'] = page_of_blogs
    context['blog_types'] = BlogType.objects.all()
    return render(request, 'blog/blog_list.html', context)

request

  • HttpRequest.GET : 返回一个 querydict 对象(类似于字典),该对象包含了所有的HTTP GET参数

querydict 的方法

  1. QueryDict.get(key,default=None) 返回key所对应的value,若key不存在,则返回default的值

  2. QueryDict.update(other_dict) 更新

  3. QueryDict.values() 列出所有的值

  4. QueryDict.items() 列出所有的键值对,若一个key有多个值,只显示最后一个值。

  5. QueryDict.pop(key) 删除某个键值对

  6. QueryDict.getlist(key) 根据输入的key返回一个Python中的list

  7. QueryDict.dict() 返回QueryDict的字典的表现形式

修改前端页面

{% extends 'base.html' %}

{% block title %}个人博客网站{% endblock %}
{% block nav_blog_active %}active{% endblock %}

{% load staticfiles %}
{% block head %}
    <link rel="stylesheet" href="{% static 'blog/css/blog_type.css' %}">
{% endblock %}

{% block content %}
    <div class="container">
        <div class="row">
            <div class="col-sm-9">
                 <div class="panel panel-default">
                    <div class="panel-heading">{% block block_list_title %}博客列表 (一共有{{ page_of_blogs.paginator.count }}篇博客) {% endblock %}</div>
                    <div class="panel-body">
                        {% for blog in page_of_blogs.object_list %}
                            <div class="blog">
                                <h3>
                                    <a href="{% url 'blog_detail' blog.id %}">
                                        {{ blog.title }}
                                    </a>
                                </h3>
                                <p class="blog-info">
                                    <span class="glyphicon glyphicon-tag"></span> <a href="{% url 'blog_with_type' blog.blog_type.pk %}">{{ blog.blog_type }}</a>
                                    <span class="glyphicon glyphicon-time"></span> {{ blog.created_time | date:"Y-m-d" }}
                                </p> 
                                <p>{{ blog.content|truncatechars:50 }}</p>
                            </div>
                        {% empty %}
                            <div class="blog">
                                <h3> 暂无博客,敬请期待 </h3>
                            </div>
                        {% endfor %}
                    </div>
                </div>
            </div>

            <div class="col-sm-3 hidden-xs">
                <div class="panel panel-default">
                    <div class="panel-heading">博客分类</div>
                    <div class="panel-body">
                        <ul class="blog-types">
                            {% for blog_type in blog_types %}
                                <li>
                                    <a href="{% url 'blog_with_type' blog_type.pk %}">
                                        {{ blog_type.type_name }}
                                    </a>
                                </li>
                            {% empty %}
                                <li>暂无分类</li>
                            {% endfor %}
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

添加分页

<div aria-label="Page navigation">
    <ul class="pagination">
        <li>
            <a href="#" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
            </a>
        </li>
        {% for page_num in page_of_blogs.paginator.page_range %}
            <li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
        {% endfor %}

        <li>
            <a href="#" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        </li>
    </ul>
</div>

完善分页, 添加上一页和下一页功能

<ul class="pagination">
    <li>
        {% if page_of_blogs.has_previous %}
            <a href="?page={{ page_of_blogs.previous_page_number }}" aria-label="Previous">
                <span aria-hidden="true">&laquo;</span>
            </a>
        {% else %}
            <span aria-hidden="true">&laquo;</span>
        {% endif %}
    </li>

    {% for page_num in page_of_blogs.paginator.page_range %}
        <li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
    {% endfor %}

    <li>
        {% if page_of_blogs.has_next %}
            <a href="?page={{ page_of_blogs.next_page_number }}" aria-label="Next">
                <span aria-hidden="true">&raquo;</span>
            </a>
        {% else %}
            <span aria-hidden="true">&raquo;</span>
        {% endif %}
    </li>
</ul>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值