Django使用心得(四)

本篇主要讲解如何在django的模板中自定义tag。

主要内容:

  • 自定义tag的步骤
  • 带参数和不带参数的自定义tag
  • 在模板中使用自定义的tag
  • 补充说明

1. 自定义tag的步骤

自定义tag主要有以下5步:

1.1 新建django工程 customTags。建立方法参见Django使用心得(一)

1.2 新建文件夹templatetags,好像必须是这个名字。

1.3 在文件夹templatetags中新建一个空文件__init__.py,表明templatetags是个python模块。

1.4 在此文件夹中新建python文件,并实现自定义的tag。

1.5 在settings.py文件的INSTALLED_APPS中添加此模块。

1.6 在模板中先load自定义tag所在的模块,在使用自定义tag。

2. 带参数和不带参数的自定义tag

下面实现上面步骤 1.3。在templatetags文件夹中新建文件myTags.py,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
from django import template
register = template.Library()
 
def do_tags_without_para( parser, token ):
    return TagsWithoutPara()
 
def do_tags_with_para( parser, token ):
    paras = token.split_contents()
    if len( paras ) != 6:
        raise template.TemplateSyntaxError("this tag takes exactly five arguments")
 
    return TagsWithPara(paras)
 
class TagsWithoutPara( template.Node ):
    def render( self, context ):
        context['content'] = "My custom tags without parameters"
        return ''
 
class TagsWithPara( template.Node ):
    def __init__( self, paras ):
        self.paras = paras
 
    def render( self, context ):
        context['paras_0'] = self.paras[0]
        context['paras_1'] = self.paras[1]
        context['paras_2'] = self.paras[2]
        context['paras_3'] = self.paras[3]
        context['paras_4'] = self.paras[4]
        context['paras_5'] = self.paras[5]
        return ''
 
register.tag('custom_tags_without_para', do_tags_without_para)
register.tag('custom_tags_with_para', do_tags_with_para)

实现一个自定义tag的方法

  • 定义一个tags类并继承template.Node,其中的render方法有个参数context,里面的内容可以在模板中使用。
  • 定义一个方法do_***(),此方法就是返回自定义的tags类。
  • 利用方法register.tag(para1, para2)注册自定义的tag,其中para1即为在模板中使用的tag名称,para2是上一步定义的方法。

3. 在模板中使用自定义的tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title>Custom tags</title>
    </head>
    <body>
        {% load myTags %}
        <h1>custom tags without parameters</h1>
        {% custom_tags_without_para %}
        <p>Content is :</p>
        <h2>{{ content }}</h2>
 
        <hr />
         
        <h1>custom tags with 5 parameters</h1>
        {% custom_tags_with_para a b c d e %}
        <p>parameters are :</p>
        <h2>the tag name is : {{ paras_0 }}</h2>
        <h2>{{ paras_1 }}</h2>
        <h2>{{ paras_2 }}</h2>
        <h2>{{ paras_3 }}</h2>
        <h2>{{ paras_4 }}</h2>
        <h2>{{ paras_5 }}</h2>
    </body>
</html>

4. 补充说明

为了能在模板中使用自定义tag,还需要在settings.py文件的INSTALLED_APPS中添加templatetags所在模块。

注意,这里是templatetags所在模块,而不是上面myTags.py所在的模块。

只要在INSTALLED_APPS中加入'customTags', 即可,我开始做的时候一直是加入'customTags.templatetags',

然后运行时模板始终找不到自定义的tag。

原来django在找自定义tag时会自动在INSTALLED_APPS里的各个模块后加上.templatetags。

这也是本文开始时【1.2 新建文件夹templatetags,好像必须是这个名字。】的原因。

我的整个示例工程的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
D:\Vim\python\django
     |- customTags
     |         |- __init__.py
     |         |- manage.py
     |         |- settings.py
     |         |- urls.py
     |         |- views.py
     |         |
     |         `- templatetags
     |             |- __init__.py
     |             `- myTags.py
     |
     `- django-templates
               `- customTags
                   `- index.html

运行后页面如下:

捕获

posted @   wang_yb  阅读(3472)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示