Закрыть

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

Цитата дня

Vivazzi.ru

Личный сайт Мальцева Артема

Если ничего не помогает, прочтите документацию, наконец! (о программировании)
RaD

Особенности использования 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" после своего запроса.

Попробуйте