一个易于编写自定义Django模板标签的微库
项目描述
django-tag-parser
一个易于编写自定义Django模板标签的微库。
功能
用于解析标签的函数,特别是:“args”,“kwargs”和“as varname”语法。
用于编写自定义包含标签的真正OOP类。
函数
parse_token_kwargs: 将标记分割为标签名、参数和kwargs。
parse_as_var: 从标记中提取“as varname”。
基本类(在tag_parser.basetags中)
BaseNode: 一个具有一些基本解析能力的模板Node对象。
BaseInclusionNode: 一个具有类似包含标签行为的Node,但允许动态覆盖template_name。
BaseAssignmentNode: 一个返回上下文值的Node,使用as var语法。
BaseAssignmentOrOutputNode: 一个要么显示值,要么将其插入上下文的Node。
BaseAssignmentOrInclusionNode:一个允许使用{% get_items template="..." %}和{% get_items as var %}语法的类。
基类允许实现@register.simple_tag、@register.inclusion_tag和@register.assignment_tag等特性,同时仍然留有扩展解析、渲染或语法验证的空间。例如,并非所有参数都需要被视为模板变量、过滤器或文本关键词。
从v3.0版本开始,不再需要使用@template_tag装饰器。可以直接在类名上使用@register.tag("name")。
安装
首先安装模块,最好是在虚拟环境中进行。可以从PyPI安装。
pip install django-tag-parser
示例
在模板标签库的顶部,始终包含标准的Django register变量和我们的template_tag装饰器。
from django.template import Library
from tag_parser import template_tag
register = Library()
参数和关键字参数
要解析类似
{% my_tag "arg1" keyword1="bar" keyword2="foo" %}
的语法
from django.template import Library
from tag_parser.basetags import BaseNode
register = Library()
@register.tag('my_tag')
class MyTagNode(BaseNode):
max_args = 1
allowed_kwargs = ('keyword1', 'keyword2',)
def render_tag(self, context, *tag_args, **tag_kwargs):
return "Tag Output"
自定义解析
使用Django的标准Node类,可以更容易地实现自定义语法。例如,要解析
{% getfirstof val1 val2 as val3 %}
的语法
from django.template import Library, Node, TemplateSyntaxError
from tag_parser import parse_token_kwargs, parse_as_var
register = Library()
@register.tag('getfirstof')
class GetFirstOfNode(Node):
def __init__(self, options, as_var):
self.options = options # list of FilterExpression nodes.
self.as_var = as_var
@classmethod
def parse(cls, parser, token):
bits, as_var = parse_as_var(parser, token)
tag_name, options, _ = parse_token_kwargs(parser, bits, allowed_kwargs=())
if as_var is None or not choices:
raise TemplateSyntaxError("Expected syntax: {{% {0} val1 val2 as val %}}".format(tag_name))
return cls(options, as_var)
def render(self, context):
value = None
for filterexpr in self.options:
# The ignore_failures argument prevents that the value becomes TEMPLATE_STRING_IF_INVALID.
value = filterexpr.resolve(context, ignore_failures=True)
if value is not None:
break
context[self.as_var] = value
return ''
贡献
本模块旨在通用。如果对它有任何不满,或者认为它不够灵活,请告诉我们。我们很高兴改进它!
如果您有任何其他有价值的贡献、建议或想法,也请告诉我们,因为我们将会考虑。我们也欢迎pull requests。:-)