zoukankan      html  css  js  c++  java
  • Python 分页和shell命令行模式

    前言

    除了手动添加你的文章后外,你还可以用命令行来添加,python 自带了一种命令行 就是 shell

    快速添加博文:Shell命令行模式

    在你的目录下:mysite

    python manage.py shell

    导入Blog模型:

    >>> from blog.models import Blog

    验证是否成功引用:

    >>> dir()

    查看所有博文:

    >>> Blog.objects.all()

    查看博文数量:

    >>> Blog.objects.count()

    模型新增对象

    实例化对象:

    >>> blog = Blog()

    查看是否成功:

    >>> dir()

    因为库中没有,所以库中查不到:

    >>> Blog.objects.all()

    添加文章标题:

    >>> blog.title = "shell下第一篇"

    添加文章内容:

    >>> blog.context = "xxxxxxxxxxxxxx"

    引入BlogType:

    >>> from blog.models import BlogType

    查询所有BlogType:

    >>> BlogType.objects.all()

    添加文章类型:

    >>> blog.blog_type = BlogType.objects.all()[0]

    引入Django的User模型:

    >>> from django.contrib.auth.models import User

    添加作者:

    >>> blog.author = User.objects.all()[0]

    保存入库:

    >>> blog.save()

    查询最新修改时间:

    >>> blog.last_updated_time

    如果这样一篇一篇当然麻烦,就可以用for 循环来添加

    添加大量文章:

    >>> for i in range(1, 31):
    ...     blog = Blog()
    ...     blog.title = "for %s" % i
    ...     blog.content = "xxxx: %s" % i
    ...     blog.blog_type = BlogType.objects.all()[0]
    ...     blog.author = User.objects.all()[0]
    ...     blog.save()

    记住上面。。。 后面必须要空格

    查看是否成功新增:

    >>> Blog.objects.all().count()

    引入分页器

     你的文章过多的话,还是需要分页的,python 自带一个软件

    >>> from django.core.paginator import Paginator

    查看是否成功引入:

    >>> dir()

    有些不需要的可以移除,比如:

    >>> del Blog

    因为后面需要用分类页码来分页

    这里最好重新开始 退出

    >>> exit()

    实例化分页器:

    >>> paginator = Paginator(blogs, 10) # 第一个参数是具体的对象列表,第二个参数是每页文章数

    模型有默认的排序,但不知道是不是每页的内容不一样,即第一篇博文可能在这一页出现,同时在另一页也出现。所以,最好有个排序规则。按照这个排序规则分页。

    然后在你的 blog/models 下修改

    ...
    class Blog(models.Model):
        title = models.CharField(max_length=50)
        blog_type = models.ForeignKey(BlogType, on_delete=models.DO_NOTHING)
        content = models.TextField()
        author = models.ForeignKey(User, on_delete=models.DO_NOTHING)
        created_time = models.DateTimeField(auto_now_add=True)
        last_updated_time = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return "<Blog: %s>" % self.title
    
        class Meta:
            ordering = ['-created_time'] # 按照created_time倒序排序

    然后重新 数据库和更新

    $ python manage.py makemigrations
     $ python manage.py migrate

    重新打开shell,引入需要的包(Blog、Paginator),再次实例化分页器:

     >>>  paginator = Paginator(blogs, 10)

    可以打印出paginator:

     >>> paginator

    查看pagnitor有什么属性和方法:

     >>> dir(paginator)

    查看有多少篇文章:

     >>> paginator.count

    查看页码:

     >>> paginator.page_range

    取第一页:

     >>> page1 = paginator.page(1)

    分页的使用

     过GET方法获取请求参数,例如: http://127.0.0.1:8000/blog/?page=2 
    修改blog/views.py:

    from django.shortcuts import render_to_response, get_object_or_404
    from django.core.paginator import Paginator
    from .models import Blog, BlogType
    
    def blog_list(request):
    
        blogs_all_list = Blog.objects.all()
        paginator = Paginator(blogs_all_list, 10)
        page_num = request.GET.get('page', 1) # 获取url的页码参数。GET返回字典,page_num默认为1
        page_of_blogs = paginator.get_page(page_num)
    
        context = {}
        context['page_of_blogs'] = page_of_blogs
        # context['blogs_count'] = Blog.objects.all().count()
        context['blog_types'] = BlogType.objects.all()
        return render_to_response('blog/blog_list.html', context)
    ...

    修改blog/templates/blog/blog_list.html:

    {% extends 'base.html' %}
    
    {% block title %}
        我的网站
    {% endblock %}
    
    {% block nav_blog_active %}
        active
    {% endblock %}
    
    {% load staticfiles %}
    {% block header_extends %}
        <link rel="stylesheet" href="{% static 'blog/blog.css' %}">
    {% endblock %}
    
    {% block content %}
        <div class="container">
            <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-9 col-lg-10">
                    <div class="panel panel-default">
                        <div class="panel-heading">{% block blog_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></h3><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h3>
                                    <p class="blog-info">
                                        <span class="glyphicon glyphicon-tag"></span><a href="{% url 'blogs_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.context|truncatechars:120 }}</p>
                                </div>
                            {% empty %}
                                <div class="blog">
                                    <h3>---暂无博文,敬请期待---</h3>
                                </div>
                            {% endfor %}
                        </div>
                    </div>
                </div>
                <div class="hidden-xs col-sm-4 col-md-3 col-lg-2">
                    <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 'blogs_with_type' blog_type.pk %}">{{ blog_type.type_name }}</a>
                                    </li>
                                {% empty %}
                                    <li>暂无分类</li>
                                {% endfor %}
                            </ul>
                        </div>
                    </div>
                </div>
            </div>
            <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>
                            <li>
                                {# 页码 #}
                                {% for page_num in page_of_blogs.paginator.page_range %}
                                    <a href="?page={{ page_num }}">{{ page_num }}</a>
                                {% endfor %}
                            </li>
                            <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>
            </div>
        </div>
    {% endblock %}

     然后 运行虚拟环境p

    python manage.py runserver

    就可以看到咯 

  • 相关阅读:
    .NET : 单元测试到底给我们带来什么
    .NET : 如何将16进制颜色代码转换为十进制
    LINQ : 谈谈LINQ TO SQL中的直接加载和延迟加载
    .NET : 单元测试的几个Attribute介绍
    .NET : 在单元测试中使用外部文件作为数据源
    再来谈谈json
    .NET : 关于图片格式的问题
    VSTS : 比较性能基准
    .NET : 如何将大文件写入到数据库中
    LINQ : 如何在JOIN或者GROUP BY的时候使用复合键
  • 原文地址:https://www.cnblogs.com/yf-html/p/9346327.html
Copyright © 2011-2022 走看看