Как указать строки и столбцытег с использованием wtforms - PullRequest
15 голосов
/ 08 февраля 2011

Создание объекта wtforms TextAreaField выглядит примерно так:

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

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

Ответы [ 9 ]

14 голосов
/ 25 февраля 2011

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

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

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

6 голосов
/ 11 августа 2016

намного проще; используйте аргумент 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() }}
4 голосов
/ 06 ноября 2011

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

3 голосов
/ 03 декабря 2015

Вот пример:

<div class="row">
    <div class="col-md-12">
        <div class="form-group">
            {{ wtf.form_field(form.notes, rows=5) }}
        </div>
    </div>
</div>
3 голосов
/ 20 апреля 2013

На 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;
}
1 голос
/ 17 января 2019

Мне удалось изменить строки и столбцы с помощью тега 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>
1 голос
/ 27 августа 2014

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

_formhelpers.html * * 1004

{% 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>

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

0 голосов
/ 18 ноября 2014

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

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.

0 голосов
/ 08 февраля 2011

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

...