作者: zifanwang 发布于2020-05-17
利用Django内置的分页模块:Paginator类(:Paginator官网例子), 因为是对文章分页,因此需要修改article/views.py中article_list视图:
...
from django.core.paginator import Paginator
def article_list(request):
# 取出所有博客文章
article_list = ArticlePost.objects.all()
# 每页显示一篇文章
paginator = Paginator(article_list, 3)
# 获取url中的页码
page = request.GET.get('page')
# 将导航对象相应的页码内容返回给articles
articles = paginator.get_page(page)
# 需要传递给模板对象
context = {'articles': articles}
# render函数载入模板,并返回context对象
return render(request, 'article/list.html', context)
...
接下来在templates/article/list.html的最底部( {% endblock content %} 上面 )加入分页内容:
...
<div class="pagination row">
<div class="m-auto">
<span class="step-links">
{% if articles.has_previous %}
<a href="?page=1" class="btn btn-success">
« 1
</a>
<span>...</span>
<a href="?page={{ articles.previous_page_number }}"
class="btn btn-secondary"
>
{{ articles.previous_page_number }}
</a>
{% endif %}
<span class="current btn btn-danger btn-lg">
{{ articles.number }}
</span>
{% if articles.has_next %}
<a href="?page={{ articles.next_page_number }}"
class="btn btn-secondary"
>
{{ articles.next_page_number }}
</a>
<span>...</span>
<a href="?page={{ articles.paginator.num_pages }}"
class="btn btn-success"
>
{{ articles.paginator.num_pages }} »
</a>
{% endif %}
</span>
</div>
</div>
最后运行服务器(python manage.py runserver)再查看效果:
分页功能完成
首先修改文章的模型article/models.py:
class ArticlePost(models.Model):
...
updated = models.DateTimeField(auto_now=True)
total_views = models.PositiveIntegerField(default=0)
...
PositiveIntegerField是用于存储正整数的字段 接着生成迁移:
python manage.py makemigrations
C:\mysite>python manage.py makemigrations
System check identified some issues:
WARNINGS:
article.ArticlePost.created: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Migrations for 'article':
article\migrations\0005_auto_20200517_1338.py
- Add field total_views to articlepost
- Alter field created on articlepost
C:\mysite>
执行迁移:
C:\mysite>python manage.py migrate
System check identified some issues:
WARNINGS:
article.ArticlePost.created: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use `django.utils.timezone.now`
Operations to perform:
Apply all migrations: admin, article, auth, contenttypes, sessions, userprofile
Running migrations:
Applying article.0005_auto_20200517_1338... OK
C:\mysite>
我们一般需要在文章列表和文章详情中显示各个文章的浏览量,因此先修改article/list.html:
...
<div class="card-footer">
<a href="{% url 'article:article_detail' article.id %}" class="btn btn-primary">read</a>
<span>
<small class="col align-self-end" style="color: gray;">
views: {{ article.total_views }}
</small>
</span>
...
接着修改详情模板article/detail.html:
{% extends "base.html" %}
{% load static %}
{% block title %}
article
{% endblock title %}
{% block content %}
<div class="container">
<div class="row">
<h1 class="col-12 mt-4">{{ article.title }}</h1>
<div class="col-12 alert alert-success">Author: {{ article.author }}</div>
{% if user == article.author %}
.<a href="#" onclick="confirm_delete()">Delete</a>
.<a href="{% url "article:article_update" article.id %}">Edit</a>
{% endif %}
<div>
views: {{ article.total_views }}
</div>
<div class="col-12">
<p>{{ article.body|safe }}</p>
</div>
...
再修改article/views.py中article_detail使其点击一次文章详情total_views就+1:
def article_detail(request, id):
...
article.total_views += 1
article.save(update_fields=['total_views'])
...
update_fields=[]指定了数据库只更新total_views字段,优化执行效率。 我们点进一个文章:
发现文章的浏览量已经自动增加了
这样文章浏览量功能就已经完成了