如何轻松地在Django中编写自定义模板标签?

时间:2011-02-22 16:16:42

标签: django templatetags

在Django中编写模板标签并不容易,并且需要大量的样板代码。 什么是最痛苦的方法呢?

  • 是否有任何库?
  • 是否有任何不涉及第三方应用的技巧?
  • 你的方式是什么?

(一旦我想要怎么做,我会把这篇文章作为社区维基。)

3 个答案:

答案 0 :(得分:6)

尝试使用django-classy-tags https://github.com/ojii/django-classy-tags

答案 1 :(得分:4)


有一些libs:

  • django-templatetag-sugar

    之前使用它。使每个事情变得更简单,但我无法想象如何使用它来处理许多可选参数。

    用法示例::

    ''' {% example_tag for val as asvar %} '''
    
    @tag(register, [
        Constant("for"), Variable(),
        Optional([Constant("as"), Name()]),
        ])
    def example_tag(context, val, asvar=None):
        if asvar:
            context[asvar] = val
            return ""
        else:
            return val
    
  • 被原作者遗弃的
  • django-tagcon

  • django-ttag django-tagcon的分支

    由于基于类的方法和关键字参数支持(如{% output limit=some_limit|default:1 offset=profile.offset %}

    ,这两个看起来很有希望

    示例用法::

    class Welcome(ttag.Tag):
        ''' {% welcome current_user fallback "Hello, anonymous." %} '''
        user = ttag.Arg(positional=True)
        fallback = ttag.Arg(default='Hi!')
    
        def output(self, data)
            name = data['user'].get_full_name()
            if name:
                return 'Hi, %s!' % name
            return data['fallback']
    

答案 2 :(得分:0)

我使用fancy_tag装饰器:http://pypi.python.org/pypi/fancy_tag

非常简单和强大,它带有很好的文档。

当您只想将模板标记的输出分配给上下文变量时,删除所有样板文件。还处理(可变长度)参数和关键字参数。

比django-templatetag-sugar更容易使用。

除了内置的包含标签装饰器之外,我还没有其他任何需要。