Django提供了以下函数,可以轻松地创建自己的模板标签:
模板标签必须存在于Django应用程序中。
在博客应用程序目录中,创建一个新目录,将其命名为templatetags,并向其中添加一个空的__init__.py文件。在同一文件夹中创建另一个文件,并将其命名为blog_tags.py。命名文件的方式很重要。您将使用此模块的名称来加载模板中的标记。 ?
首先创建一个简单的标记来检索博客中发布的文章总数。
编辑刚刚创建的blog_tags.py文件
from django import template
from ..models import Post
register = template.Library()
@register.simple_tag
def total_posts():
return Post.published.count()
📌添加新的模板标记模块后,您将需要重新启动Django开发服务器,以便在模板中使用新的标签和过滤器。
在使用自定义模板标签之前,必须使用{% load %}标签使它们在模板中可用。
打开blog/templates/base.html模板,在顶部添加{% load blog_tags %}来加载你的模板标签模块。然后,使用创建的标记来显示您的帖子总数。只需将{% total_posts %}添加到模板中。
{% load blog_tags %}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <meta name="viewport" content="width=device-width, initial-scale=1.0">
? ? <title>{% block title %}{% endblock %}</title>
? ? <link href="{% static 'css/blog.css' %}" rel="stylesheet">
</head>
<body>
? ? <div id="content">
? ? ? ? {% block content %}
? ? ? ? {% endblock %}
? ? </div>
? ? <div id="sidebar">
? ? ? ? <h2>My blog</h2>
? ? ? ? ? ? <p>This is my blog.I've written {% total_posts %} posts so far.</p>
? ? </div>
</body>
</html>
现在创建另一个标记,在博客的侧边栏中显示最新的文章。
使用包含(模版)标记。使用包含标记,可以用模板标记返回的上下文变量呈现模板。
编辑blog_tags.py文件并添加以下代码:
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
? ? latest_posts = Post.published.order_by('-publish')[:count]
? ? return { 'latest_posts':latest_posts}
使用blog/post/latest_posts.html指定必须用返回值呈现的模板。
模板标记将接受一个可选的count参数,默认值为5。该参数允许指定要显示的帖子数量。
📌该函数返回一个变量字典,而不是一个简单的值。包含标签必须返回一个值的字典。
现在,在templates/blog/post/下创建一个新的模板文件,并将其命名为latest_posts.html。 ?
<ul>
{% for post in latest_posts %}
<li>
<a href="{{ post.get_absolute_url }}">{{ post.title}}</a>
</li>
{% endfor %}
</ul>
使用模板标记返回的latest_posts变量显示了一个无序的帖子列表。
编辑blog/base.html模板
<div id="sidebar">
<h2>My blog</h2>
<p>This is my blog.I've written {% total_posts %} posts so far.</p>
<h3>Latest posts</h3>
{% show_latest_posts 3 %}
</div>
并添加新的模板标记以显示最后三篇文章。
最后,创建一个标签来显示评论最多的帖子,它将结果存储在一个可以重用的变量中,而不是直接输出结果。
编辑blog_tags.py文件
from django import template
from ..models import Post
from django.db.models import Count
register = template.Library()
@register.simple_tag
def total_posts():
return Post.published.count()
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5):
latest_posts = Post.published.order_by('-publish')[:count]
return { 'latest_posts':latest_posts}
@register.simple_tag
def get_most_commented_posts(count=5):
return Post.published.annotate(
total_comments=Count('comments')
).order_by('-total_comments')[:count]
编辑blog/base.html模板
{% load blog_tags %}
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}{% endblock %}</title>
<link href="{% static 'css/blog.css' %}" rel="stylesheet">
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
<div id="sidebar">
<h2>My blog</h2>
<p>This is my blog.I've written {% total_posts %} posts so far.</p>
<h3>Latest posts</h3>
{% show_latest_posts 3 %}
<h3>Most commented posts</h3>
{% get_most_commented_posts as most_commented_posts %}
<ul>
{% for post in most_commented_posts %}
<li>
<a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
</div>
</body>
</html>
关于Django模版的更多信息模板 | Django 文档 | Django (djangoproject.com)