十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签

目录:Django 2.1 从零开始搭建博客网站系列

服务器环境搭建(选学)

  • 在阿里云服务器从零开始上线Django项目:Ubuntu18.04+Python3+Django2,并通过公网IP访问

小试牛刀——简单的博客网站

  • 一、Django2.1 搭建简单的博客网站
  • 二、Django2.1 搭建简单的博客网站扩展——自定义模板和静态文件位置

庖丁解牛——多用户的博客网站之用户模块

  • 三、Django2.1 搭建多用户的博客网站——登录
  • 四、Django2.1 搭建多用户的博客网站——注册
  • 五、Django2.1 搭建多用户的博客网站——修改密码
  • 六、Django2.1 搭建多用户的博客网站——重置密码
  • 七、Django2.1 搭建多用户的博客网站——维护个人详细信息
  • 八、Django2.1 搭建多用户的博客网站——头像上传
  • 九、Django2.1 搭建多用户的博客网站——用户模块小结

庖丁解牛——多用户的博客网站之文章模块

  • 十、Django2.1 搭建多用户的博客网站——文章栏目
  • 十一、Django2.1 搭建多用户的博客网站——简单的文章发布
  • 十二、Django2.1 搭建多用户的博客网站——使用Markdown发布文章
  • 十三、Django2.1 搭建多用户的博客网站——修改和删除文章
  • 十四、Django2.1 搭建多用户的博客网站——向用户展示文章
  • 十五、Django2.1 搭建多用户的博客网站——文章模块小结

华丽转身——多用户的博客网站之扩展功能

  • 十六、Django2.1 搭建多用户的博客网站——文章点赞功能
  • 十七、Django2.1 搭建多用户的博客网站——统计文章浏览次数
  • 十八、Django2.1 搭建多用户的博客网站——文章评论功能
  • 十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签
  • 二十、Django2.1 搭建多用户的博客网站——文章标签
  • 二十一、Django2.1 搭建多用户的博客网站——美图模块
  • 未完待续

项目源码下载:https://github.com/jt1024/lehehe

正文:

{% if %} 和 {% for %}这些是Django模板中的默认标签,为了应对更多复杂的操作,Django还允许开发者自定义模板标签,共有三种自定义模板标签,分别是simple_tag、inclusion_tag、assignment_tag。

下面我们将通过实例分别使用以上三种自定义模板标签。

在 ./articles 中创建一个目录 templatetags,这个目录名称是Django默认的,必须使用这个名称,不能更改。然后在里面创建两个文件 __ init __.py(init两边分别是两个下划线) 和 article_tags.py

1、使用自定义模板标签显示文章总数

编辑 ./article/templatetags/article_tags.py

from django import template

register = template.Library()
from article.models import ArticlePost


@register.simple_tag
def total_articles():
    return ArticlePost.objects.count()

修改 ./templates/article/list/article_titles.html
在这行代码

{% extends "base.html" %} 

下面增加

 {% load article_tags %}

然后在这行代码

阅读,丰富头脑,善化行为

下面增加

 

这里已经有{% total_articles %}篇文章供你阅读

完整的./templates/article/list/article_titles.html代码如下:

{% extends "base.html" %}
{% load article_tags %}
{% block title %} articles {% endblock %}
{% block content %}

阅读,丰富头脑,善化行为

这里已经有{% total_articles %}篇文章供你阅读

{% for article in articles %}

{{article.title}}

作者:{{article.author.username}}

概要:{{article.body|slice:'70'| linebreaks}}

{% endfor %} {% include "paginator.html" %}
{% endblock %}

运行Django,打开文章详情,查看效果


十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签_第1张图片
显示文章总数

2、使用自定义模板标签显示某一个作者的文章总数

编辑 ./article/templatetags/article_tags.py 新增以下代码

@register.simple_tag
def author_total_articles(user):
    return user.article.count()

修改 ./templates/article/list/author_articles.html
同样的,增加

 {% load article_tags %}

然后在这行代码

{{ user.username }}

下面增加

 

共发表{% author_total_articles user %}篇文章

完整的./templates/article/list/author_articles.html代码如下

{% extends "base.html" %}
{% load article_tags %}
{% load staticfiles %}
{% block title %}articles{% endblock %}
{% block content %}

阅读,丰富头脑,善化行为

{% for article in articles %}

{{article.title}}

作者: {{article.author.username}}

概要:{{article.body|slice:'70'|linebreaks}}

{% endfor %} {% include "paginator.html" %}
{% if userinfo.photo %} {% else %} {% endif %}

{{ user.username }}

共发表{% author_total_articles user %}篇文章

{% if userinfo %}

{{ userinfo.company }}

{{ userinfo.aboutme }}

{% else %}

这个作者太懒了,什么也没有留下。

{% endif %}
{% endblock %}

点击文章列表中的作者,效果如图


十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签_第2张图片
某一作者的文章列表

3、使用自定义模板标签显示最新发布的文章

编辑 ./article/templatetags/article_tags.py 新增latest_articles

@register.inclusion_tag('article/list/latest_articles.html')
def latest_articles(n=5):
    latest_articles = ArticlePost.objects.order_by("-created")[:n]
    return {"latest_articles": latest_articles}

创建 ./templates/article/list/latest_articles.html


修改 ./templates/article/list/article_content.html
增加

 {% load article_tags %}

然后在"最受欢迎文章"之后增加以下代码


最新文章

{% latest_articles 4 %}

点击某篇文章,效果如图


十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签_第3张图片
显示最新文章

4、使用自定义模板标签显示评论最多的文章

编辑 ./article/templatetags/article_tags.py 新增most_commented_articles

from django.db.models import Count

@register.simple_tag
def most_commented_articles(n=3):
    return ArticlePost.objects.annotate(total_comments=Count('comments')).order_by("-total_comments")[:n]

修改 ./templates/article/list/article_content.html 在"最新文章"之后增加以下代码


最多评论文章

{% most_commented_articles as most_comments %}

完整的./templates/article/list/article_content.html代码如下

{% extends "base.html" %}
{% load article_tags %}
{% load staticfiles %}
{% block title %}articles list{% endblock %}
{% block content %}

{% with total_likes=article.users_like.count users_like=article.users_like.all %}

{{ article.title }}

{{ article.author.username }} {{ total_likes }}like{{ total_likes|pluralize }} {{ total_views }} view{{ total_views|pluralize}}

点赞本文的读者

{% for user in article.users_like.all %}

{{user.username}}

{% empty %}

还没有人对此文章表态

{% endfor %}

本文有{{ comments.count }}评论

{% for comment in article.comments.all %}

{{ comment.commentator }}说:

{{ comment.body }}

{% empty %}

没有评论

{% endfor %}

看文章,发评论,不要沉默

{% csrf_token %}
{{ comment_form.commentator}}
{{ comment_form.body }}

最受欢迎文章

    {% for article_rank in most_viewed %}
  1. {{ article_rank.title }}
  2. {% endfor %}

最新文章

{% latest_articles 4 %}

最多评论文章

{% most_commented_articles as most_comments %}
{% endwith %} {% endblock %}

点击某篇文章,效果如图


十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签_第4张图片
显示最多评论文章

你可能感兴趣的:(十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签)