Тег тега недействителен - PullRequest
1 голос
/ 16 июня 2011

Я написал блочный тег, при попытке вызвать его в шаблоне я получил сообщение об ошибке:

Недопустимый тег блока: 'endyoutube'

Мой тег

from django import template

register = template.Library()

@register.tag
def youtube(parser, token):
    link = parser.parse(('endyoutube', ))
    iframe = """<iframe width="640" height="510" src="%s" frameborder="0" 
        allowfullscreen></iframe>""" % link
    return YoutubeNode(iframe)

class YoutubeNode(template.Node):
    def __init__(self, iframe):
        self.iframe = iframe

    def render(self, context):
        video = self.iframe.render(context)
        return video

template

{% load customtags %}
{% youtube %}
    http://www.youtube.com/watch?v=yZt1qXnOOqU
{% endyoutube %}

Что не так в моем теге?Как я мог это исправить?

1 Ответ

0 голосов
/ 17 июня 2011

Я понял.Первая ошибка - я не использовал delete_first_token (), он удалял закрывающий тег из токенов, это было причиной ошибки.Вторая ошибка - невозможно вставить проанализированные данные в строку функции, потому что это не строка, а класс django.template.debug.DebugNodeList.Этот объект требует, чтобы метод render () был строкой, вызываемой в экземпляре класса Node.И последнее - ссылки на YouTube для вставки и для часов разные.

Работоспособный тег

class YoutubeNode(template.Node):
    def __init__(self, parsed_link):
        self.parsed_link = parsed_link

    def render(self, context):
        del_it = re.compile('&amp;feature=related')
        replace_it = re.compile('watch\?v=')
        link = self.parsed_link.render(context)
        link = del_it.sub('', link)
        link = replace_it.sub('embed/', link)
        video = """<p><iframe width="550" height="438" src="%s" 
        frameborder="0" allowfullscreen></iframe></p>""" % link
        return video

@register.tag
def youtube(parser, token):    
    parsed_link = parser.parse(('endyoutube', ))
    # first token it's closing tag. delete_first_token just delete it - del    self.tokens[0];)
    parser.delete_first_token()
    return YoutubeNode(parsed_link)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...