Как указать строки и столбцы тега <textarea> с помощью wtforms

Построение wtforms TextAreaField выглядит примерно так:

content = wtf.TextAreaField('Content', id="content-area", validators=[validators.Required()])

Как указать количество строк и столбцов, связанных с этим текстовым полем?

Ответы

Ответ 1

Вы не должны делать это в том месте, где вы объявляете виджет. Вы делаете это в шаблоне. Например,

{{form.content(rows='50',cols='100')}}

Необходимо убедиться, что строки и столбцы указаны в виде строки.

Ответ 2

{{form.text(cols="35", rows="20")|safe}} работает

Ответ 3

В Flask есть учебник по nettuts +. В принципе, он работает следующим образом:

from flask.ext import wtf

class ContactForm(wtf.Form):
    content = wtf.TextAreaField("Content", [validators.Required()])

и в вашем html:

<form action="" method="post">
    {{ form.content }}
</form>

Вместо указания макета в html вы можете указать его в своем css, например:

form textarea#content {
     width: 100px;
     height: 100px;
     max-width: 100px;
}

Ответ 4

Гораздо проще; используйте аргумент render_kw при создании поля:

port = IntegerField(u"HTTP port", validators=[DataRequired(), NumberRange(1025, 65535)], render_kw={'class': 'form-control'})
mytextarea = TextAreaField(u"Content", render_kw={'class': 'form-control', 'rows': 5})

И затем визуализируйте файл:

{{ field() }}

Ответ 5

Для удобства сначала добавьте этот макрос.

_formhelpers.html:

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}

Импортируйте этот макрос и код таким образом. он должен работать.

{% from "_formhelpers.html" import render_field %}
<form action="" method="post">
    {{ render_field(form.content,rows=100, cols=100) }}
</form>

Надеюсь, что это поможет!

Ответ 6

Вот пример:

<div class="row">
    <div class="col-md-12">
        <div class="form-group">
            {{ wtf.form_field(form.notes, rows=5) }}
        </div>
    </div>
</div>

Ответ 7

Вы можете просто использовать этот замещающий виджет, который запоминает значения по умолчанию для рендеринга:

import wtforms.widgets.core

class TextArea(wtforms.widgets.core.TextArea):
    def __init__(self, **kwargs):
        self.kwargs = kwargs

    def __call__(self, field, **kwargs):
        for arg in self.kwargs:
            if arg not in kwargs:
                kwargs[arg] = self.kwargs[arg]
        return super(TextArea, self).__call__(field, **kwargs)

Теперь вы можете добавить этот новый виджет в свое поле:

content = wtf.TextAreaField(
    'Content',
    id='content-area',
    widget=TextArea(rows=50,cols=100),
    validators=[validators.Required()])

Теперь вы можете отобразить это поле без дополнительных аргументов и получить текстовое поле размером 50x100.

Ответ 8

Мне удалось изменить строки и столбцы с помощью тега render_kw на странице форм Python. Когда я впервые увидел определение этого на веб-сайте WTForm, я не знал, что он сделал, пока не увидел другие примеры использования этого для изменения класса элемента формы. Так что их определение просто смущало меня, пока я не начал экспериментировать с ним.

render_kw (dict) - если предоставляется, словарь, который предоставляет ключевые слова по умолчанию, которые будут переданы виджету во время визуализации. - https://wtforms.readthedocs.io/en/stable/fields.html

Я использовал это на своей странице форм.

current_templates_in_library = TextAreaField('current_templates_in_library', render_kw={'rows':'4'})

Чтобы добавить несколько тегов и значений, просто разделите их запятой, как это.

render_kw={'class':'myclass','rows':'4'}

Затем это было отображено в HTML. Обратите внимание на добавленный там атрибут "rows".

<textarea class="form-control" id="current_templates_in_library" name="current_templates_in_library" rows="4" style="z-index: auto; position: relative; line-height: 20px; font-size: 14px; transition: none 0s ease 0s; background: transparent !important;">
rhel6
rhel7
win_2012r2
centos7
</textarea>

Ответ 9

Я просмотрел код и обнаружил, что класс Field определяет как __new__, так и __init__. __new__ берет кучу *args и **kargs. Таким образом, вы можете просто передать rows=x cols=y в свой файл TextAreadField, и он должен работать. Я заметил, что wtforms создает для таких случаев класс под названием "UnboundField", я не знаю последствий этого, поскольку это может вызвать проблемы, если они есть. Но следующий шаг создания TextAreaField будет таким же. (Это управление переходит к вызову __init__ как и раньше.)