Django шаблон: как передать отформатированную строку для включения тега - PullRequest
0 голосов
/ 24 февраля 2020

Я новичок в шаблонах Django и Django, я знаю Django Шаблон является своего рода ограничительным сравнением с Rails.

Поэтому я включаю шаблон в электронную почту, например:

{% include "./partials/_info_row.html" with value=f'{request_count} requests' %}

но выдает ошибку: TemplateSyntaxError: Could not parse the remainder: ''{request_count} requests'' from 'f'{request_count} requests''

Есть ли способ передать отформатированную строку, подобную этой, для включения тега?

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

Исключение вызвано тем, что вы не можете использовать f-строки в Django шаблонах - язык шаблонов на самом деле не является Python. Согласно do c нет необходимости явно передавать переменную контекста при использовании include:

Загружает шаблон и отображает его в текущем контексте.

Если вам нужно передать комбинированное значение (контекст и что-то еще, например, строку «запросы»), вы можете использовать простой тег :

tags.py

@register.simple_tag(takes_context=True)
def your_custom_tag(context, format_string):
    request_count = context['request_count']
    return f'{request_count} requests'

teamplates

{% with r_count=your_custom_tag %}
{% include "./partials/_info_row.html" with value=r_count %}
0 голосов
/ 24 февраля 2020

Спасибо @Chamel и @crazyzuber. Я использовал комбинацию ваших ответов. Создан пользовательский фильтр.

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

Кстати, я использовал @register.filter

@register.filter(is_safe=True)
def request_count_text(count):
    return f"{count} request{ 's' if count > 1 else '' }"

и использовал его как:

{% include "./_info_row.html" with value=request_count|request_count_text %}

Это решает мою проблему.

0 голосов
/ 24 февраля 2020
{% include "./partials/_info_row.html" with value=request_count|stringformat:'s'|add:' requests' %}
  1. request_count | stringformat: 's' - преобразовать число в строку
  2. some_var | add: 'запросы' - строки concat
...