【问题标题】:Having trouble implementing custom template tags in Django在 Django 中实现自定义模板标签时遇到问题
【发布时间】:2012-04-01 01:23:15
【问题描述】:

我正在尝试在我的应用程序中实现一些自定义模板标签,并更好地构建它。 烦人的部分是我已经按照教程类型的帖子获取代码,但它仍然不起作用。

我尝试按照thiscurrent_time 来实现一些标签,但我遇到了我不理解的错误。

首先,最新帖子的过滤器,或者在我的情况下,最新的屏幕给出了 Exception Value: No module named gallery

我的项目名为“S3gallery”,我的应用名为“gallery”,我的模型名为“screenshots”。标签的模型参数在文档中说它需要 app_name.Model_name 这是我给它的,所以我坚持这个。

我的自定义标签代码如下所示;

from django.template import Library, Node
from django.db.models import get_model

register = Library()

class LatestContentNode(Node):
    def __init__(self, model, num, varname):
        self.num, self.varname = num, varname
        self.model = get_model(*model.split('.'))

    def render(self, context):
        context[self.varname] = self.model._default_manager.all()[:self.num]
        return ''

def get_latest(parser, token):
    bits = token.contents.split()

    if len(bits) != 5:
        raise TemplateSyntaxError, "get_latest_screens tag takes exactly three arguments"
    if bits[3] != 'as':
        raise TemplateSyntaxError, "second argument to the get_latest_screens tag must be 'as'"

    return LatestContentNode(bits[1], bits[2], bits[4])

get_latest = register.tag(get_latest)

我尝试使用{% load get_latest gallery.screenshots 5 as recent_screens %} 将其加载到模板中,而我看到的示例没有在标签中使用“加载”,但如果我这样做,Django 将无法识别该标签。我是否迷失了方向,但认为我会走对路。 对此的任何帮助将不胜感激:)

【问题讨论】:

    标签: python django django-custom-tags


    【解决方案1】:

    {% load %} 模板标签用于加载您的自定义模板标签,而不是渲染它。如果您的get_latest 标记在模块my_tags.py 中定义,那么您应该使用

    加载它
    {% load my_tags %}
    

    有关详细信息,请参阅文档的 code layout 部分。

    在模板中加载标签后,您就可以使用它了:

    {% get_latest gallery.screenshots 5 as recent_screens %}
    

    【讨论】:

    • 太棒了。谢谢你。现在这更有意义了,我的两个标签现在都没有给出错误,并且显示了当前时间,所以这是朝着正确方向迈出的一步:D
    【解决方案2】:

    听着,我花了一段时间才知道这个,因为它是一个新功能,所以没有一个博客有它,但是 -- 你知道simple_tag 吗?

    如果您知道,我深表歉意,但对于我自己的 99% 的情况,我可以做到这一点(没有解析器)。

    这是我今天早上实际部署的一些实际代码:

    from django import template
    
    from ost2.api.hostname import app_reverse, app_reverse_lazy
    
    register = template.Library()
    
    @register.simple_tag(name="app_url")
    def app_url(namespaced_url, prefix=None, *args, **kwargs):
        return app_reverse(namespaced_url, args=args, kwargs=kwargs, prefix=prefix)
    

    ... 就像您想的那样工作:{% app_url yodogg="I heard you like tags" %} ... 参数的工作方式就像在函数调用中一样。

    【讨论】:

    • 不,我只使用了大约 2 周的 Python 和大约 1 周的 Django,所以我没有听说过很多这样的东西!我只是查了一下,因为它看起来很有帮助。我的下一个工作是移动一个函数来加载按钮按下以将内容从 S3 加载到我的数据库。这应该会有所帮助,谢谢。
    • 很高兴听到这个消息。 simple_tag 还有一个表亲inclusion_tag,它适用于你的标签代码与模板强耦合的情况,而且更简单。无论你在游戏中玩了多久,其中的一些东西都不是显而易见的,因为在 1.0 版本前后有大量的 django 博客文章,它们仍然在谷歌上发挥作用。无论如何,祝你好运先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2015-01-20
    • 2011-05-02
    • 1970-01-01
    • 2021-07-13
    • 2017-07-29
    相关资源
    最近更新 更多