Закрыть

Для эффективной работы на сайте используются cookie и обработка персональных данных. Пользуясь этим сайтом, вы соглашаетесь с правилами использования сайта. Подробнее

Цитата дня

Особенности использования classy tags

Встретилась на моём пути маленькая проблемка совместного использования MultiValueArgument и MultiKeywordArgument:

class MyTag(Tag):
    name = 'my_tag'
    options = Options(
        MultiValueArgument('args'),
        MultiKeywordArgument('kwargs'),
        blocks=[('end_my_tag', 'nodelist')],
    )

    def render_tag(self, context, args, kwargs, nodelist):
        # some logic ...
        return some_result

# in template
{% my_tag var_1 var_2 key_1=v_1 key=v_2 %}

Но это приводит к ошибке, так как: MultiValueArgument берёт все аргументы 'var_1 var_2 key_1=v_1 key=v_2' и пытается каждый аргумент распарсить в том числе и 'key_1=v_1' на что classy tags отвечает:

TemplateSyntaxError at /.../
Could not parse the remainder: '=v_1' from 'key_1=v_1'

Чтобы решить данную проблему, можно воспользоваться каким-нибудь стопором, например 'word_breakpoint':

class MyTag(Tag):
    name = 'my_tag'
    options = Options(
        MultiValueArgument('args'),
        'word_breakpoint',
        MultiKeywordArgument('kwargs'),
        blocks=[('end_my_tag', 'nodelist')],
    )

    def render_tag(self, context, args, kwargs, nodelist):
        # some logic ...
        return some_result

# in template
{% my_tag var_1 var_2 word_breakpoint key_1=v_1 key=v_2 %}

Но это же вынуждает нас использовать 'word_breakpoint'! Кстати, замечу, что этот стопор похож на стопор 'as' для реализации InclusionTag в самой Django или через classy tags.

Я начал искать решение не использовать стопор и благо нашёл в исходниках Django CMS https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py#L1038

Теперь можно заменить MultiValueArgument на MultiValueArgumentBeforeKeywordArgument, например так:

from cms.templatetags.cms_tags import MultiValueArgumentBeforeKeywordArgument

class MyTag(Tag):
    name = 'my_tag'
    options = Options(
        MultiValueArgumentBeforeKeywordArgument('args'),
        MultiKeywordArgument('kwargs'),
        blocks=[('end_my_tag', 'nodelist')],
    )

    def render_tag(self, context, args, kwargs, nodelist):
        # some logic ...
        return some_result

# in template
{% my_tag var_1 var_2 key_1=v_1 key=v_2 %}

И всё будет работать :)

Я писал разработчику classy tags с предложением модифицировать MultiValueArgument или добавить тотже MultiValueArgumentBeforeKeywordArgument в classy tags https://github.com/ojii/django-classy-tags/issues/39

Но в случае с модификацией MultiValueArgument, как пишет автор, могут возникать случаи, когда в значении аргумента используется знак '=', например:

{% my_tag "key_1=v_1" foo=bar %}

Я согласен с ним: хоть и редко, но такие случаи могут быть, например, при работе со строкой GET параметров.

А по поводу добавления нового класса наподобие MultiValueArgumentBeforeKeywordArgument в classy tags - разработчик этого не захотел. Он пишет, что приветствуется расширять какой-нибудь класс, находящийся в библиотеке classy tags. Собственно с MultiValueArgumentBeforeKeywordArgument так и вышло.

Может кому-нибудь другому удастся его убедить, но а пока используйте MultiValueArgumentBeforeKeywordArgument, который находится в Django CMS.

Оцените статью

0 из 5 (всего 0 оценок)

Поля, отмеченные звёздочкой ( * ) , являются обязательными.

Спасибо за ваш отзыв!

Автор статьи

Права на использование данной статьи, расположенной на настоящей странице http://vivazzi.ru/it/use-classy-tags/:

Разрешается копировать статью с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Мальцев Артём
Ссылка на статью: <a href="http://vivazzi.ru/it/use-classy-tags/">http://vivazzi.ru/it/use-classy-tags/</a>

Подробнее: Правила использования сайта

Вам нужно саморазвиваться или вы хотите зарабатывать деньги?

Или вы ищите хорошие IT сервисы или книги? Сохраните свое время и взгляните на мою подборку рекомендаций, которыми постоянно пользуюсь.
Посмотреть рекомендации

Комментариев: 0

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

Чтобы оставить комментарий от своего имени войдите или зарегистрируйтесь обычным способом или через социальные сети:

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте