Шаблон тега "добавить" требует 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/