Возникли проблемы при реализации пользовательских тегов шаблонов в Django - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь реализовать некоторые пользовательские теги шаблонов, чтобы немного улучшить их в моем приложении и лучше структурировать его.Раздражает то, что я следовал за постом типа учебника, чтобы получить код, и он все еще не работает.

Я пытался следовать этому и current_time для реализации некоторых тегов, но я получаю ошибки, которых я не понимаю.

Во-первых, фильтр последних сообщений, или в моем случае последние экраны, дает Exception Value: No module named gallery

Мой проект называется «S3gallery», мое приложение называется «галерея», а моя модель называется «скриншоты».Аргумент модели тега говорит, что в документах он принимает 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 %}, и примеры, которые я видел, не используют 'load' в теге, но если я это сделаю, Django не распознает тег.Неужели я заблудился от этого, но думаю, что я иду по правильному пути.Любая помощь по этому вопросу будет принята с благодарностью:)

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Тег шаблона {% load %} используется для загрузки пользовательского тега шаблона, а не для его рендеринга.Если ваш тег get_latest определен в модуле my_tags.py, вам следует загрузить его, используя

{% load my_tags %}

См. Раздел документации документации для получения дополнительной информации.*

После того, как вы загрузили тег в свой шаблон, вы можете использовать его:

{% get_latest gallery.screenshots 5 as recent_screens %}
2 голосов
/ 15 марта 2012

Слушай, мне понадобилось время, чтобы узнать об этом, потому что это новая функция, поэтому ни в одном из блогов ее не было, но - ты знаешь о 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" %} ... аргументы работают так же, как в вызовах функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...