Можно ли стилизовать часть метки в Flask -WTForms? - PullRequest
0 голосов
/ 06 августа 2020

Я генерирую форму через Flask -WTF.

Соответствующий флажок выглядит так:

    conditions = BooleanField(
        "I agree to the above conditions.", validators=[DataRequired()])

Я бы хотел, чтобы I agree был жирным или сильным - НЕ остальная часть предложения.

Я не могу передать теги HTML, поскольку они экранируются и отображаются как текст.

Это будет выглядеть так:

[] <strong>I agree</strong> to the above conditions.

Я бы хотел получить такой результат:

Я согласен с вышеуказанными условиями.

Возможно ли это?

Спасибо за любые подсказки.

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Есть два решения:

  • При создании поля с использованием render_kw .
  • При визуализации поля в шаблоне (когда поле вызывается [form.field()]).

Инициализировать поле со стилем:

Все объекты поля в WTForms имеют render_kw arg в __init__.

render_kw (dict) - если предоставлен, словарь, содержащий ключевые слова по умолчанию, которые будут переданы виджету во время рендеринга.

Когда ваш шаблон визуализируется, Jinja2 будет читать это render_kw . В вашем случае вы можете определить:

conditions = BooleanField(
    "I agree to the above conditions.", validators=[DataRequired()],
    render_kw={"style": "font-weight: bold;")

Рендеринг при создании шаблона

Когда Jinja2 рендерит, вы можете указать другие параметры рендеринга, вызвав поле .

form.field()

__call__(**kwargs): отобразите это поле как HTML, используя аргументы ключевого слова в качестве дополнительных атрибутов.

[...]

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

Итак, в вашем файле шаблона вы можете сделать что-то вроде этого:

{{ form.field(style="font-weight: bold;") }}

Обратите внимание, что есть исключение для ключевого слова class, вероятно, зарезервировано чем-то другим , то ключ должен быть class_.

Источник: Поля - Документация WTForms

1 голос
/ 06 августа 2020

Простым решением было бы просто сделать это в шаблоне. Вместо:

{{ user_form.conditions.errors }}{{ user_form.conditions.label_tag }}<br />{{ user_form.conditions }}

do:

{{ user_form.conditions.errors }}<strong>I agree</strong> to the above conditions.<br />{{ user_form.conditions }}

Я не тестировал это, но вы можете сделать:

conditions = BooleanField(
    "<strong>I agree</strong> to the above conditions.", validators=[DataRequired()])

, а затем, в шаблоне:

{{ user_form.conditions.errors }}{{ user_form.conditions.label_tag|safe }}<br />{{ user_form.conditions }}
0 голосов
/ 07 августа 2020

Благодаря другому ответу @gaefan я прочитал больше о шаблонах Jinja и фильтре safe и придумал другое рабочее решение.

from flask import Markup

label_for_conditions = Markup('<span class="customClass">I agree</span> to the above conditions.')
conditions = BooleanField(label_for_conditions, validators=[DataRequired()])

Для этого решения не требуется даже safe фильтр в шаблоне.

Этот ответ основан на следующем обсуждении:

Передача HTML в шаблон с помощью Flask / Jinja2

Это не идеальное решение, поскольку теперь HTML и Python смешаны в определении формы, но похоже, что вам нужно пойти на компромисс.

...