[django]在模板上自定义显示内容(django tag)
来源:互联网 发布:用户日志 程序员日志 编辑:程序博客网 时间:2024/04/28 18:11
最近学些django,练习了一下定义django tag。记录一下。
我定义了一个两个表,如下:
#models.pyclass package(models.Model): packageDetail = models.TextField()class product(models.Model): id = models.CharField(max_length=30,primary_key=True) name = models.CharField(max_length=100)
其中,packageDetail字段里存储的是一组product表中的id,结构如 [ ' id1 ' , ' id2 ' ]。
views.py代码如下,功能主要是为了显示所有package内容
#views.pydef packagesIndex(request): packages = package.objects.all() return render_to_response('tariffManagement/packageIndex.html',locals())
然后我定义了一个模板index.html
#index.html<table><tr><td>内容</td></tr>{% for package in packages %}<tr><td>{% load testTag %}{% getNames package.packageDetail %} </td></tr>{% endfor %}</table>
该模板是显示package内容,内容为product的名字。因为packageDetail字段存的是一组product的id,因此我需要把它转化成相对应的name。
{% load testTag %} 这里是加载一个tag文件testTag.py。
{% getNames package.packageDetail %} ,getNames 是函数名,package.packageDetail是需要转换的值,这种格式跟一般函数调用类似。
然后开始自定义tag。我首先在该app下创建templatetags文件夹,并在该文件夹下创建__init__.py空文件和testTag.py两个文件。testTag.py里面就是自定义的tag。代码如下:
#testTag.pyfrom django import templatefrom tables import productregister = template.Library()@register.tag(name="getNames")
def getNames(parser,token): try: packageStr = token.split_contents() except ValueError: msg = '%r tag requires a single argument' % token.split_contents()[0] raise template.TemplateSyntaxError(msg) return getProductName(packageStr[1])class getProductName(template.Node): def __init__(self, packageStr): self.packageStr= packageStr def render(self,context): packageDetail=template.resolve_variable(self.packageStr, context) productNameList = [] products = product.objects.all() for productValue in products: if productValue.id in packageDetail: productNameList.append(productValue.name) productNameStr="<br/>".join(productNameList) return productNameStr
1、def getNames(parser,token):,paser是模板parser对象,我没有用到,token是传过来的值。
2、token.split_contents()就是按空格把传过来的值分割,但引号内的不分。
3、class getProductName(template.Node):是定义了一个类,它重新定义了输出内容,通过render()来实现。
4、packageDetail=template.resolve_variable(self.packageStr, context) 是取传过来的值
5、后面的代码就是完成找出相对应的name,并以字符串的形式返回。
功能完成了,但是还是有一些细节没搞懂,这在以后的代码中继续学习。
- [django]在模板上自定义显示内容(django tag)
- Django模板之自定义tag和filter
- django tag 自定义
- Django模板之显示字典中内容
- django 模板内容小计
- 自定义Django模板过滤器
- Django - 模板 自定义 context_processors
- Django | 模板 自定义 context_processors
- django探秘 (2)个性化模板tag
- Django模板中常用的标签(tag)
- Django里面的自定义tag和filter
- Python3之Django Web框架模板篇(templates)与自定义filter与tag
- django创建自定义模板处理器
- django自定义模板引用问题
- django模板显示树状结构
- django模板
- django模板
- Django 模板
- 如何在java程序中使用sikuli脚本
- Ext.grid.GridPanel .
- cocos2d-x 遮罩效果实现
- 最短路径算法研究未完成的算法
- poj 3628
- [django]在模板上自定义显示内容(django tag)
- HTTP协议详解(真的很经典)
- Ajax初学者(2)
- [IDE]eclipse各种插件的下载地址
- 资源,类对象
- 资金管理要领和交易策略举要
- /dev/mem
- 操作分区表对global和local索引的影响 (转)
- In App Purchase的介绍