跳转到主要内容

一个易于编写自定义Django模板标签的微库

项目描述

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

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"

包含标签

要创建具有可覆盖的template_name的包含标签

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

的语法

from django.template import Library
from tag_parser.basetags import BaseInclusionNode

register = Library()

@register.tag("my_include_tag")
class MyIncludeTag(BaseInclusionNode):
    template_name = "mytags/default.html"
    max_args = 1

    def get_context_data(self, parent_context, *tag_args, **tag_kwargs):
        (foo,) = *tag_args
        return {
            'foo': foo
        }

可以覆盖get_template_name()方法以支持动态解析模板名称。默认情况下,它检查template标签关键字参数和template_name属性。请注意,模板节点之后将被缓存,每次调用时不能返回随机的模板。

赋值标签

要创建可以自我渲染或返回上下文数据的赋值标签

{% get_tags template="custom/example.html" %}
{% get_tags as popular_tags %}

的语法

from django.template import Library
from tag_parser.basetags import BaseAssignmentOrInclusionNode

register = Library()


@register.tag('get_tags')
class GetPopularTagsNode(BaseAssignmentOrInclusionNode):
    template_name = "myblog/templatetags/popular_tags.html"
    context_value_name = 'tags'
    allowed_kwargs = (
        'order', 'orderby', 'limit',
    )

    def get_value(self, context, *tag_args, **tag_kwargs):
        return query_tags(**tag_kwargs)   # Something that reads the tags.

块标签

要有一个“开始..结束”块,在类中定义end_tag_name

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

的语法

from django.template import Library
from tag_parser.basetags import BaseAssignmentOrInclusionNode

register = Library()


@register.tag('my_tag')
class MyTagNode(BaseNode):
    max_args = 1
    allowed_kwargs = ('keyword1', 'keyword2',)
    end_tag_name = 'end_my_tag'

    def render_tag(self, context, *tag_args, **tag_kwargs):
        # Render contents inside
        return self.nodelist.render(context)

自定义解析

使用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。:-)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

django-tag-parser-3.2.tar.gz (15.2 kB 查看哈希)

上传时间

构建分布

django_tag_parser-3.2-py2.py3-none-any.whl (17.4 kB 查看哈希)

上传时间 Python 2 Python 3

由以下支持