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

发布于 2024-10-18 09:00:57 字数 177 浏览 1 评论 0原文

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

  • 有没有相关的库?
  • 有没有不涉及第三方应用程序的技巧?
  • 的做法是什么?

(一旦我弄清楚如何做到这一点,我会将这篇文章作为社区维基。)

Writing template tags isn't easy in Django and involves lots of boilerplate code.
What is the least painful way to do it?

  • Are there any libs for that?
  • Are there any tricks that doesn't involve third-party apps?
  • What is your way to do it?

(I will make this post a community wiki once I figure how to do it.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

孤独岁月 2024-10-25 09:00:57

有一些库:

  • django-templatetag-sugar

    以前用过。让一切变得更简单,但我不知道如何用它处理大量可选参数。

    使用示例::

    ''' {% example_tag for val as asvar %} '''
    
    @标签(注册,[
        常量(“for”),变量(),
        可选([常量(“as”),名称()]),
        ])
    def example_tag(上下文, val, asvar=None):
        如果阿斯瓦尔:
            上下文[asvar] = val
            返回 ””
        别的:
            返回值
    
  • django-tagcon,被原始废弃作者

  • < p>django-ttagdjango-tagcon 的分支

    这两个看起来很有前途,因为基于类的方法和关键字参数支持(例如 {% output limit=some_limit|default:1 offset=profile.offset %}

    使用示例::

    类欢迎(ttag.Tag):
        ''' {%welcome current_user后备“你好,匿名。” %} '''
        用户= ttag.Arg(位置= True)
        后备= ttag.Arg(默认='嗨!')
    
        def 输出(自身,数据)
            名称 = 数据['用户'].get_full_name()
            如果名称:
                返回“嗨,%s!” % 姓名
            返回数据['后备']
    


There are some libs for that:

  • django-templatetag-sugar

    Used it before. Makes everythings simpler, but I couldn't figure how to handle lots of optional arguments with it.

    Usage example::

    ''' {% 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, abandoned by original author

  • django-ttag, fork of django-tagcon

    These two look promising because of class-based approach and keyword arguments support (like {% output limit=some_limit|default:1 offset=profile.offset %})

    Example usage::

    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']
    

浅忆流年 2024-10-25 09:00:57

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

非常简单功能强大,并且附带良好的文档。

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

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

除了内置的包含标签装饰器之外,我真的不需要任何其他东西。

I use the fancy_tag decorator: http://pypi.python.org/pypi/fancy_tag

Very simple and powerful and it comes with good documentation.

Gets rid of all that boilerplate when you just want to assign the output of a template tag to a context variable. Also handles (variable length) arguments and keyword arguments.

Much easier to use than for example django-templatetag-sugar.

I haven't really needed anything else apart from the built in inclusion tag decorator.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文