如何在Django中创建自定义模板标签
Django提供了各种内置的模板标签,如{% if %}或{% block %}。然而,Django也允许你创建自己的模板标签来执行自定义动作。自定义模板标签的强大之处在于,你可以处理任何数据,并将其添加到任何模板中,而不管执行的是什么视图。你可以执行QuerySets或处理任何数据,在你的模板中显示结果。
指定自定义模板标签最常见的地方是在Django应用程序内部。如果它们与一个现有的应用程序有关,那么将它们捆绑在那里是有意义的;否则,它们可以被添加到一个新的应用程序中。
Django提供了以下的辅助函数,让你能以简单的方式创建自己的模板标签。
- simple_tag :处理数据并返回一个字符串
- inclusion_tag :处理数据并返回一个渲染好的模板
- assignment_tag :处理数据并在上下文中设置一个变量
解释:
使用一个例子说明如何创建一个自定义模板标签。考虑一个名为geeksforgeeks的项目,有一个名为geeks的应用程序。
请参考以下文章,查看如何在Django中创建一个项目和一个应用程序。
如何在Django中使用MVT创建基本项目?
如何在Django中创建一个应用程序?
在你的django应用程序(geeks app)目录下,创建一个新的目录,命名为templatetags,并在其中添加一个空的init.py文件,以确保该目录被当作一个Python包。在同一目录下创建另一个文件,命名为 custom_tags.py。模块文件的名字就是你以后用来加载标签的名字,所以要小心挑选一个不会与其他应用程序中的自定义标签和过滤器冲突的名字。django应用程序的文件结构应该如下所示。
geeks/
__init__.py
models.py
...
templatetags/
__init__.py
custom_tags.py
在你的模板中,你将使用以下内容。
{% load custom_tags %}
你在 templatetags 包中放入多少个模块是没有限制的。只要记住,{% load %} 语句将加载给定的 Python 模块名称的标签,而不是应用程序的名称。
为了成为一个有效的标签库,模块(custom_tags.py)必须包含一个模块级变量,名为 register,它是一个模板库实例,所有的标签都在其中注册。因此,在你的模块的顶部附近,放上以下内容。
from django import template
register = template.Library()
在models.py里面添加以下代码。
from django.db import models
# Create your models here.
class YourModel(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def __str__(self):
return self.first_name
创建这个模型后,我们需要运行两个命令,以便为其创建数据库。
Python manage.py makemigrations
Python manage.py migrate
我们将首先创建一个简单的标签来检索我们的模型中的对象的总数量,命名为YourModel。编辑你刚刚创建的custom_tags.py文件并添加以下代码。
from django import template
register = template.Library()
from .models import YourModel
@register.simple_tag
def any_function():
return YourModel.objects.count()
在名为geeksforgeeks的项目的urls.py flle中添加以下代码
from django.contrib import admin
from django.urls import path
from django.views.generic.base import TemplateView
urlpatterns = [
path('admin/', admin.site.urls),
path('',TemplateView.as_view(template_name="Intro.html"),name="intro")
]
在app目录下创建名为templates的文件夹(geeks),并创建名为Intro.py的文件,添加以下代码。
{% load custom_tag %}
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>Intro</title>
</head>
<body>
{% any_function %} Persons in your model
</body>
</html>
运行,
python manage.py runserver
让我们检查一下http://localhost:8000/ 上有什么 —
输出 –
Django模型在DB中的条目 –