在 Django 中创建自定义模板标签和过滤器
介绍
Django 模板语言提供了各种内置标签和过滤器,可用于设计 Django 应用的表示层。但是,您的应用可能需要模板原始语言核心集中未包含的功能。Django 允许您使用 Python 创建自己的一组自定义标签和过滤器,并在 Django 模板中提供它们。
本指南将演示如何创建自定义模板标签和过滤器,以及如何在模板中加载它们。
入门
在您的 Django 应用程序目录中,创建一个名为templatetags的模块并添加一个空的__init__.py文件,如下面的目录结构所示。
注意:确保您已将您的应用包含在settings.py中的INSTALLED_APPS中。
my_app/
├── __init__.py
├── admin.py
├── models.py
├── templatetags/
│ ├── __init__.py
│ └── custom_tags.py
└── views.py
接下来,打开custom_tags.py文件并添加这两行以开始使用自定义模板标签和过滤器。
from django import template
register = template.Library()
通过在模板中加载custom_tags使其可用。
{% load custom_tags %}
编写自定义模板过滤器
过滤器不过是一个 Python 函数,它接受一个或两个参数。例如,在过滤器{ {var|filter_f:arg}}中,过滤器filter_f将作为arg传递给变量var和参数。
为了演示,创建一个过滤器以根据参数修改字符串。在views.py中创建一个简单的视图,该视图呈现字符串如下:
def my_view(request):
context = {
"author": "gaurav singhal",
}
return render(request, "index.html", context)
创建视图后,在custom_tags.py中创建一个名为modify_name的简单模板过滤器。
from django import template
register = template.Library()
def modify_name(value, arg):
# if arg is first_name: return the first string before space
if arg == "first_name":
return value.split(" ")[0]
# if arg is last_name: return the last string before space
if arg == "last_name":
return value.split(" ")[-1]
# if arg is title_case: return the title case of the string
if arg == "title_case":
return value.title()
return value
register.filter('modify_name', modify_name)
您现在可以在模板中使用modify_name过滤器。
{% comment %} index.html {% endcomment %}
{% load custom_tags %}
{{ author | modify_name:"first_name"}}<br>
{{ author | modify_name:"last_name"}}<br>
{{ author | modify_name:"title_case"}}<br>
{{ author | modify_name:"first_name" | modify_name:"title_case"}}<br>
这将产生如下输出:
gaurav
singhal
Gaurav Singhal
Gaurav
同样,您可以创建模板过滤器,然后在模板中使用它们。
编写自定义模板标签
模板标签比过滤器更强大、更复杂。Django 支持多种快捷方式,使大多数快捷方式更加容易使用。
简单标签
simple_tag 接受几个参数,并在进行一些处理后返回结果。下面是一个在模板中显示当前日期和时间的简单示例
# custom_tags.py
from django import template
register = template.Library()
import datetime
@register.simple_tag
def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
接下来,将上述自定义模板标签使用到您的模板中,如下所示:
{% comment %} index.html {% endcomment %}
{% load custom_tags %}
{% current_time "%d/%m/%Y %H:%M:%S %p" %}
这将为您提供运行 Django 服务器的当前日期和时间。
17/11/2020 14:15:59 PM
包含标签:
clusion_tag 是一种常见的模板标签类型,有助于通过渲染另一个模板来显示数据。当您想要渲染多个页面中共有的数据时,此标签非常有用。
在以下示例中,通过使用show_users_table模板标记创建名为users.html的新模板来呈现Users表。custom_tag.py修改如下:
# custom_tags.py
from django.contrib.auth import get_user_model
from django.template.loader import get_template
from django import template
register = template.Library()
User = get_user_model()
def show_users_table():
users = User.objects.all()
return {'users': users}
users_template = get_template('users.html')
register.inclusion_tag(users_template)(show_users_table)
接下来,创建一个名为users.html 的新模板并以表格格式呈现用户。
{% comment %} users.html {% endcomment %}
{% load custom_tags %}
<table>
<thead>
<tr>
<td>Username</td>
<td>First name</td>
<td>Last name</td>
<td>email</td>
</tr>
</thead>
<tbody>
{% for user in users %}
<tr>
<td>{{user.username}}</td>
<td>{{user.first_name}}</td>
<td>{{user.last_name}}</td>
<td>{{user.email}}</td>
</tr>
{% endfor %}
</tbody>
</table>
现在,您可以在任何其他模板(例如index.html )中使用上述包含标签,如下所示。
{% comment %} index.html {% endcomment %}
{% load custom_tags %}
{% show_users_table %}
这将以表格方式呈现用户,如下所示。
Username First name Last name email
gaurav_singhal Gaurav Singhal xyz@gmail.com
结论
Django 自定义模板标签和过滤器是创建 Django 应用中可能需要的标签和过滤器的最佳方式。如果您不熟悉 Django 模板,请阅读本指南。您可以参考有关自定义模板标签和过滤器的 Django 文档以获得更多理解。如果您有任何疑问,请随时联系Codealphabet。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~