前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python Django个人网站搭建11-优化文章模块

Python Django个人网站搭建11-优化文章模块

作者头像
zifan
发布2021-12-14 12:31:28
3800
发布2021-12-14 12:31:28
举报
文章被收录于专栏:个人编程技术学习与分享

作者: zifanwang  发布于2020-05-17

1.文章分页

利用Django内置的分页模块:Paginator类(:Paginator官网例子), 因为是对文章分页,因此需要修改article/views.py中article_list视图:

代码语言:javascript
复制
...
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 %} 上面 )加入分页内容:

代码语言:javascript
复制
...
<div class="pagination row">
    <div class="m-auto">
        <span class="step-links">
            {% if articles.has_previous %}
                <a href="?page=1" class="btn btn-success">
                    &laquo; 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 }} &raquo;
                </a>
            {% endif %}
        </span>
    </div>
</div>

最后运行服务器(python manage.py runserver)再查看效果:

分页功能完成

2.文章浏览量

首先修改文章的模型article/models.py:

代码语言:javascript
复制
class ArticlePost(models.Model):
...
    updated = models.DateTimeField(auto_now=True)
    total_views = models.PositiveIntegerField(default=0)
...

PositiveIntegerField是用于存储正整数的字段 接着生成迁移:

代码语言:javascript
复制
python manage.py makemigrations
代码语言:javascript
复制
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>

执行迁移:

代码语言:javascript
复制
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:

代码语言:javascript
复制
...
<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:

代码语言:javascript
复制
{% 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>
                &nbsp;&nbsp;views: {{ article.total_views }}
            </div>
            <div class="col-12">
                <p>{{ article.body|safe }}</p>
            </div>
...

再修改article/views.py中article_detail使其点击一次文章详情total_views就+1:

代码语言:javascript
复制
def article_detail(request, id):
    ...
    article.total_views += 1
    article.save(update_fields=['total_views'])
    ...

update_fields=[]指定了数据库只更新total_views字段,优化执行效率。 我们点进一个文章:

发现文章的浏览量已经自动增加了

这样文章浏览量功能就已经完成了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.文章分页
  • 2.文章浏览量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档