微型库,可以轻松编写自定义django模板标记
django-tag-parser的Python项目详细描述
django标记分析器
一个微型库,可以轻松编写自定义django模板标记。
功能:
- 用于分析标记的函数,特别是:“args”、“kwargs”和“as varname”语法。
- 编写自定义包含标记的真正oop类。
功能:
- parse_token_kwargs:将标记拆分为标记名args和kwargs。
- parse_as_var:从令牌中提取“as varname”。
基类(在tag_parser.basetags中):
- BaseNode:一个模板Node对象,它具有一些基本的解析功能。
- BaseInclusionNode:具有类似于inclusion_tag行为的Node,但允许动态重写template_name。
- BaseAssignmentNode:使用as var语法返回上下文中的值的Node。
- BaseAssignmentOrOutputNode:显示值或将其插入上下文的Node。
- BaseAssignmentOrInclusionNode:一个允许{% get_items template="..." %}和{% get_items as var %}语法的类。
基类允许实现类似于@register.simple_tag、@register.inclusion_tag和@register.assignment_tag的功能, 同时仍留有扩展解析、呈现或语法验证的空间。 例如,并非所有参数都需要视为模板变量、筛选器或文本关键字。
从v3.0开始,不再需要@template_tagdecorator。 直接在类名上使用@register.tag("name")。
安装
首先安装模块,最好是在虚拟环境中。它可以从pypi安装:
pip install django-tag-parser
示例
在模板标记库的顶部,始终包括 djangoregister变量和我们的template_tag装饰符:
fromdjango.templateimportLibraryfromtag_parserimporttemplate_tagregister=Library()
参数和关键字参数
要分析如下语法:
{%my_tag"arg1"keyword1="bar"keyword2="foo"%}
使用:
fromdjango.templateimportLibraryfromtag_parser.basetagsimportBaseNoderegister=Library()@register.tag('my_tag')classMyTagNode(BaseNode):max_args=1allowed_kwargs=('keyword1','keyword2',)defrender_tag(self,context,*tag_args,**tag_kwargs):return"Tag Output"
自定义解析
使用django的标准Node类,可以更容易地实现自定义语法。 例如,要解析:
{%getfirstofval1val2asval3%}
使用:
fromdjango.templateimportLibrary,Node,TemplateSyntaxErrorfromtag_parserimportparse_token_kwargs,parse_as_varregister=Library()@register.tag('getfirstof')classGetFirstOfNode(Node):def__init__(self,options,as_var):self.options=options# list of FilterExpression nodes.self.as_var=as_var@classmethoddefparse(cls,parser,token):bits,as_var=parse_as_var(parser,token)tag_name,options,_=parse_token_kwargs(parser,bits,allowed_kwargs=())ifas_varisNoneornotchoices:raiseTemplateSyntaxError("Expected syntax: {{% {0} val1 val2 as val %}}".format(tag_name))returncls(options,as_var)defrender(self,context):value=Noneforfilterexprinself.options:# The ignore_failures argument prevents that the value becomes TEMPLATE_STRING_IF_INVALID.value=filterexpr.resolve(context,ignore_failures=True)ifvalueisnotNone:breakcontext[self.as_var]=valuereturn''
贡献
本模块设计为通用模块。万一你有什么不喜欢的, 或者认为它不够灵活,请让我们知道。我们很乐意改进它!
如果你有其他有价值的贡献、建议或想法, 请也让我们知道,因为我们会调查的。 也欢迎拉取请求。:-)