2

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

我试图按照这个current_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 将无法识别该标签。我是否迷失了方向,但认为我会走正确的路。对此的任何帮助将不胜感激:)

4

2 回答 2

5

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

{% load my_tags %}

有关更多信息,请参阅文档的代码布局部分。

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

{% get_latest gallery.screenshots 5 as recent_screens %}
于 2012-03-15T14:18:22.557 回答
2

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

如果您确实知道,我深表歉意,但是对于我自己的 99% 的案例,我可以做到这一点(w/oa 解析器)。

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

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

于 2012-03-15T14:20:25.763 回答