Django学习:shell命令行模式以及分页(11)

当博客数量变多了之后,一次性加载出来会特别缓慢,因此需要进行分页。另外可以借助shell命令来查看所使用的对象具有的属性和方法。

  • 进入shell命令行模式python manage.py shell,在该模式下添加一篇文章
(mysite_env) G:\mysite_env\mysite>python manage.py shell
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Blog
>>> dir()
['Blog', '__builtins__']
>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 第一篇博客>>, <Blog: <Blog: 第二篇博客>>, <Blog: <Blog: 第三篇博客>>, <Blog: <Blog: 第四篇博客>>, <Blog: <Blog: 长文本博客>>]>
>>> Blog.objects.count()
5
>>> Blog.objects.all().count()
5
>>> blog = Blog()
>>> dir()
['Blog', '__builtins__', 'blog']
>>> blog.title = 'shell模式下第一篇文章'
>>> blog.content = '这是一个测试文本'
>>> from blog.models import BlogType
>>> BlogType.objects.all()
<QuerySet [<BlogType: 古诗词>, <BlogType: 散文>, <BlogType: 感悟>]>
>>> blog_type = BlogType.objects.all()[2]
>>> blog.blog_type = blog_type
>>> from django.contrib.auth.models import User
>>> User.objects.all()
<QuerySet [<User: kongqing>]>
>>> blog.author = User.objects.all()[0]
>>> blog.save()
>>> Blog.objects.all()
<QuerySet [<Blog: <Blog: 第一篇博客>>, <Blog: <Blog: 第二篇博客>>, <Blog: <Blog: 第三篇博客>>, <Blog: <Blog: 第四篇博客>>, <Blog: <Blog: 长文本博客>>, <Blog: <Blog: shell模式下第一篇文章>>]>

访问127.0.0.1:8000查看效果,可以看到多了一篇文章。

查看blog实例对象拥有的方法

>>> dir(blog)
['DoesNotExist', 'MultipleObjectsReturned', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_column_name_clashes', '_check_constraints', '_check_field_name_clashes', '_check_fields', '_check_id_field', '_check_index_together', '_check_indexes', '_check_local_fields', '_check_long_column_names', '_check_m2m_through_same_relationship', '_check_managers', '_check_model', '_check_model_name_db_lookup_clashes', '_check_ordering', '_check_property_name_related_field_accessor_clashes', '_check_single_primary_key', '_check_swappable', '_check_unique_together', '_do_insert', '_do_update', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', '_save_parents', '_save_table', '_set_pk_val', '_state', 'author', 'author_id', 'blog_type', 'blog_type_id', 'check', 'clean', 'clean_fields', 'content', 'created_time', 'date_error_message', 'delete', 'from_db', 'full_clean', 'get_deferred_fields', 'get_next_by_created_time', 'get_next_by_last_updated_time', 'get_previous_by_created_time', 'get_previous_by_last_updated_time', 'id', 'is_deleted', 'last_updated_time', 'objects', 'pk', 'prepare_database_save', 'refresh_from_db', 'save', 'save_base', 'serializable_value', 'title', 'unique_error_message', 'validate_unique']
>>> blog.last_updated_time
datetime.datetime(2019, 8, 27, 6, 18, 23, 432358, tzinfo=<UTC>)
  • shell命令行模式下使用for循环添加多篇博客
datetime.datetime(2019, 8, 27, 6, 18, 23, 432358, tzinfo=<UTC>)
>>> for i in range(1,31):
...     blog = Blog()
...     blog.title = 'for %s' % i
...     blog.content = 'xxxx: %s' % i
...     blog.blog_type = blog_type
...     blog.author = User.objects.all()[0]
...     blog.save()
...
>>> Blog.objects.all().count()
36

进入主页查看效果

为了使用分页器对页面进行分页,需要先在model.py修改博客显示顺序,并执行迁移操作,否则会出现警告。

  • 修改blog models.py文件
from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class BlogType(models.Model):
    type_name = models.CharField(max_length=15)

    def __str__(self):
        return self.type_name

class Blog(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete='models.DO_NOTHING')
    blog_type = models.ForeignKey(BlogType, on_delete='models.DO_NOTHING')
    created_time = models.DateTimeField(auto_now_add=True)
    last_updated_time = models.DateTimeField(auto_now=True)
    is_deleted = models.BooleanField(default=False)

    def __str__(self):
        return '<Blog: %s>' % self.title

    class Meta:
        ordering = ['-created_time']
  • python manage.py makemigrationspython manage.py migrate操作。

  • shell中使用分页器进行分页

>>> from django.core.paginator import Paginator
>>> from blog.models import Blog
>>> blogs = Blog.objects.all()
>>> paginator = Paginator(blogs, 10)
>>> dir(paginator)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_object_list_is_ordered', '_get_page', 'allow_empty_first_page', 'count', 'get_page', 'num_pages', 'object_list', 'orphans', 'page', 'page_range', 'per_page', 'validate_number']
>>> paginator.count
36
>>> paginator.num_pages
4
>>> paginator.page_range
range(1, 5)
>>> page1 = paginator.page(1)
>>> page1
<Page 1 of 4>
>>> dir(page1)
['__abstractmethods__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_abc_impl', 'count', 'end_index', 'has_next', 'has_other_pages', 'has_previous', 'index', 'next_page_number', 'number', 'object_list', 'paginator', 'previous_page_number', 'start_index']
>>> page1.object_list
<QuerySet [<Blog: <Blog: for 30>>, <Blog: <Blog: for 29>>, <Blog: <Blog: for 28>>, <Blog: <Blog: for 27>>, <Blog: <Blog: for 26>>, <Blog: <Blog: for 25>>, <Blog: <Blog: for 24>>, <Blog: <Blog: for 23>>, <Blog: <Blog: for 22>>, <Blog: <Blog: for 21>>]>

开始修改后端代码

  • 修改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

# Create your views here.

def blog_list(request):
    
    blogs_all_list = Blog.objects.all()
    paginator = Paginator(blogs_all_list, 10) # 每10篇博客进行分页
    page_num = request.GET.get('page', 1) # 获取url的页面参数(GET请求)
    page_of_blogs = paginator.get_page(page_num)

    context = {}
    context['page_of_blogs'] = page_of_blogs
    context['blog_types'] = BlogType.objects.all()
    return render_to_response('blog/blog_list.html', context)


def blog_detail(request,blog_pk):
    context = {}
    context['blog'] = get_object_or_404(Blog, pk=blog_pk)
    return render_to_response('blog/blog_detail.html', context)


def blogs_with_type(request, blog_type_pk):
    context = {}
    blog_type = get_object_or_404(BlogType, pk=blog_type_pk)
    context['blog_type'] = blog_type
    context['blogs'] = Blog.objects.filter(blog_type=blog_type)
    context['blog_types'] = BlogType.objects.all()
    return render_to_response('blog/blogs_with_type.html', context)
  • 修改blog_list.html文件
{% extends 'base.html' %}
{% block title %}个人博客网站{% endblock %}
{% block nav_blog_active %}active{% endblock %}
{% load staticfiles %}

{% block header_extends %}
	<link rel="stylesheet" type="text/css" href="{% static 'blog/blog.css' %}">
{% endblock %}

{# 页面内容 #}
{% block content %}
	<div class="container">
		<div class="row"></div>
			<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|length }}篇博客){% endblock %}</div>
					 <div class="panel-body">
					    {% for blog in page_of_blogs.object_list %}
					    <div class="blog">
					    	<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.content|truncatechars_html:120 }}</p>
					    </div>
						{% empty %}
						<div class="blog">
							<h3>-- 暂无博客,敬请期待 --</h3>
						</div>
						{% endfor %}
					</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>
					    {# 全部页码 #}
					    {% 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>
				</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>
	
{% endblock %}

查看主页,分页效果如下:

posted on 2019-08-27 15:35  月见空青  阅读(545)  评论(0编辑  收藏  举报

导航