微型库,可以轻松编写自定义django模板标记

django-tag-parser的Python项目详细描述


https://img.shields.io/travis/edoburu/django-tag-parser/master.svg?branch=masterhttps://img.shields.io/pypi/v/django-tag-parser.svghttps://img.shields.io/pypi/l/django-tag-parser.svghttps://img.shields.io/codecov/c/github/edoburu/django-tag-parser/master.svg

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"

包含标签

使用可覆盖的模板名创建包含标记:

{%my_include_tag"foo"template="custom/example.html"%}

使用:

fromdjango.templateimportLibraryfromtag_parser.basetagsimportBaseInclusionNoderegister=Library()@register.tag("my_include_tag")classMyIncludeTag(BaseInclusionNode):template_name="mytags/default.html"max_args=1defget_context_data(self,parent_context,*tag_args,**tag_kwargs):(foo,)=*tag_argsreturn{'foo':foo}

也可以重写get_template_name()方法以支持模板名称的动态解析。 默认情况下,它检查template标记夸格和template_name属性。 注意,模板节点随后被缓存,不可能在每次调用时返回随机模板。

作业标签

要创建可以呈现自身或返回上下文数据的赋值标记,请执行以下操作:

{%get_tagstemplate="custom/example.html"%}{%get_tagsaspopular_tags%}

使用:

fromdjango.templateimportLibraryfromtag_parser.basetagsimportBaseAssignmentOrInclusionNoderegister=Library()@register.tag('get_tags')classGetPopularTagsNode(BaseAssignmentOrInclusionNode):template_name="myblog/templatetags/popular_tags.html"context_value_name='tags'allowed_kwargs=('order','orderby','limit',)defget_value(self,context,*tag_args,**tag_kwargs):returnquery_tags(**tag_kwargs)# Something that reads the tags.

块标记

开始…end“块,在类中定义end_tag_name

{%my_tagkeyword1=foo%}
    Tag contents, possibly other tags.
{%end_my_tag%}

使用:

fromdjango.templateimportLibraryfromtag_parser.basetagsimportBaseAssignmentOrInclusionNoderegister=Library()@register.tag('my_tag')classMyTagNode(BaseNode):max_args=1allowed_kwargs=('keyword1','keyword2',)end_tag_name='end_my_tag'defrender_tag(self,context,*tag_args,**tag_kwargs):# Render contents insidereturnself.nodelist.render(context)

自定义解析

使用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''

贡献

本模块设计为通用模块。万一你有什么不喜欢的, 或者认为它不够灵活,请让我们知道。我们很乐意改进它!

如果你有其他有价值的贡献、建议或想法, 请也让我们知道,因为我们会调查的。 也欢迎拉取请求。:-)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法启动应用程序:JNLP错误   java根据用户输入在PreparedStatement中使用setTime()或setNull()   java EJB与同步   java以object为键通过hashmap进行搜索   java中的模10^9+7   针对包含其他对象的对象的java OOP最佳实践   如何将字符串作为HTML代码从Java文件读取到JSP页面?   java我的POM怎么了?“解析表达式..检测到递归表达式循环”   用于Hbase的Mapreduce的java NoSuchMethodError   JAVAlang.SecurityException:权限拒绝:启动意图{act=安卓.Intent.action.MAIN cat=[安卓.Intent.category.LAUNCHER]   数组初始化谜语Java   通过arraylist搜索时的java句柄关联