在Django中实现自定义模板标记时遇到问题

时间:2012-03-15 14:04:56

标签: python django django-custom-tags

我正在尝试使用我的应用程序实现一些自定义模板标签以及更好地构建它。 令人讨厌的部分是我已经按照教程类型的帖子来获取代码&它仍然无效。

我尝试按照thiscurrent_time来实施某些代码,但我遇到了一些我不理解的错误。

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

我的项目名为“S3gallery”,我的应用程序称为“图库”,我的模型称为“屏幕截图”。标签的模型arg在文档中说appcc.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 %}在模板中加载它,我见过的示例不会在标记中使用'load',但如果我这样做,Django就无法识别标记。我是否因此而迷失,但我想我会走向正确的道路。 任何有关这方面的帮助将不胜感激:)

2 个答案:

答案 0 :(得分:5)

{% load %}模板标记用于加载自定义模板标记,而不是呈现它。如果您在模块get_latest中定义了my_tags.py标记,则应使用

加载它
{% load my_tags %}

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

在模板中加载标记后,即可使用它:

{% get_latest gallery.screenshots 5 as recent_screens %}

答案 1 :(得分: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" %} ...参数就像在函数调用中一样工作。