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

运行后页面如下:

捕获



本文转自wang_yb博客园博客,原文链接:http://www.cnblogs.com/wang_yb/archive/2011/05/12/2044908.html,如需转载请自行联系原作者

目录
打赏
0
0
0
0
51
分享
相关文章
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
本文介绍了一个基于Django框架、协同过滤算法、ECharts数据可视化以及Bootstrap前端技术的酒店推荐系统,该系统通过用户行为分析和推荐算法优化,提供个性化的酒店推荐和直观的数据展示,以提升用户体验。
274 1
【优秀python web毕设案例】基于协同过滤算法的酒店推荐系统,django框架+bootstrap前端+echarts可视化,有后台有爬虫
基于爬虫和机器学习的招聘数据分析与可视化系统,python django框架,前端bootstrap,机器学习有八种带有可视化大屏和后台
本文介绍了一个基于Python Django框架和Bootstrap前端技术,集成了机器学习算法和数据可视化的招聘数据分析与可视化系统,该系统通过爬虫技术获取职位信息,并使用多种机器学习模型进行薪资预测、职位匹配和趋势分析,提供了一个直观的可视化大屏和后台管理系统,以优化招聘策略并提升决策质量。
366 4
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
346 45
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
214 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
147 2
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
86 1
Python Web框架比较:Django vs Flask vs Pyramid
Python Web框架比较:Django vs Flask vs Pyramid
92 4

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等