Шаблон тега "добавить" требует 2 аргумента, 1 предоставляется

Я использовал add раньше, но на этот раз получаю эту странную ошибку:

django.template.exceptions.TemplateSyntaxError: add requires 2 arguments, 1 provided

со следующим кодом:

{% render_field form.full_name type="hidden" class="form-control" \
   value=user.first_name|add:"something" %}

Однако я не получаю ошибку, если я перееду add в with:

{% with fullname=user.first_name|add:"something"%}
   {% render_field form.full_name type="hidden" class="form-control" \
      value=fullname %}
{% endwith %}

1 ответ

Решение

Похоже, вы используете render_field тег шаблона от https://github.com/jazzband/django-widget-tweaks/

render_field реализован в виде расширенного пользовательского тега, который реализован сопровождающим пакета, к сожалению, не поддерживающего фильтры в списке аргументов.

simple_tag или же inclusion_tag с другой стороны; который определяется Джанго; поддерживает другие фильтры в своем списке аргументов.

Я хочу сказать, что это будет работать, если бы simple_tag или же inclusion_tag{% my_tag 123 "abcd" book.title warning=message|lower profile=user.profile %}

Однако если my_tag был зарегистрирован как расширенный пользовательский тег; поддержка фильтров в аргументах зависит от реализации.

Как я вижу из реализации render_field код; это расширенный пользовательский тег и поддержка фильтров, похоже, не работает:

@register.tag
def render_field(parser, token):
    """
    Render a form field using given attribute-value pairs

    Takes form field as first argument and list of attribute-value pairs for
    all other arguments.  Attribute-value pairs should be in the form of
    attribute=value or attribute="a value" for assignment and attribute+=value
    or attribute+="value" for appending.
    """
    error_msg = '%r tag requires a form field followed by a list of attributes and values in the form attr="value"' % token.split_contents()[0]
    try:
        bits = token.split_contents()
        tag_name = bits[0]
        form_field = bits[1]
        attr_list = bits[2:]
    except ValueError:
        raise TemplateSyntaxError(error_msg)

    form_field = parser.compile_filter(form_field)

    set_attrs = []
    append_attrs = []
    for pair in attr_list:
        match = ATTRIBUTE_RE.match(pair)
        if not match:
            raise TemplateSyntaxError(error_msg + ": %s" % pair)
        dct = match.groupdict()
        attr, sign, value = \
            dct['attr'], dct['sign'], parser.compile_filter(dct['value'])
        if sign == "=":
            set_attrs.append((attr, value))
        else:
            append_attrs.append((attr, value))

    return FieldAttributeNode(form_field, set_attrs, append_attrs)

В частности, пары key=value хранятся в attr_list в коде и работать против ATTRIBUTE_RE соответствие регулярному выражению

Затем фильтр запускается с помощью parser.compile_filter(dct['value']), тем не мение dct['value'] является 'user.first_name|add:"' -> текст "something" потерян здесь Я думаю, что ATTRIBUTE_RE регулярное выражение должно быть улучшено, чтобы поддержать это.

>>> ATTRIBUTE_RE.match('value=user.first_name|add:"something"')
<_sre.SRE_Match object at 0x7f8617f5a160>
>>> match.groupdict()
{'attr': 'value', 'value': 'user.first_name|add:"', 'sign': '='}

Как видите, ключ значения не работает и отсутствует полный текст, который вы указали; который нарушает фильтр добавления вниз по течению.

Это именно тот случай, когда with тег предназначен для решения; поскольку он абстрагирует процесс фильтрации до уровня выше; и вы можете передать новую переменную в ваш пользовательский render_field пометить красиво.

Рекомендации:

Как использовать шаблонный фильтр для пользовательского тега шаблона?

https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/

Другие вопросы по тегам