目录
快速添加博客
- shell命令行模式添加博客 :
- python manage.py shell
- 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 的方法
-
QueryDict.get(key,default=None) 返回key所对应的value,若key不存在,则返回default的值
-
QueryDict.update(other_dict) 更新
-
QueryDict.values() 列出所有的值
-
QueryDict.items() 列出所有的键值对,若一个key有多个值,只显示最后一个值。
-
QueryDict.pop(key) 删除某个键值对
-
QueryDict.getlist(key) 根据输入的key返回一个Python中的list
-
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">«</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">»</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">«</span>
</a>
{% else %}
<span aria-hidden="true">«</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">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
</ul>