Ответ 1
Вы не должны делать это в том месте, где вы объявляете виджет. Вы делаете это в шаблоне. Например,
{{form.content(rows='50',cols='100')}}
Необходимо убедиться, что строки и столбцы указаны в виде строки.
Построение wtforms TextAreaField выглядит примерно так:
content = wtf.TextAreaField('Content', id="content-area", validators=[validators.Required()])
Как указать количество строк и столбцов, связанных с этим текстовым полем?
Вы не должны делать это в том месте, где вы объявляете виджет. Вы делаете это в шаблоне. Например,
{{form.content(rows='50',cols='100')}}
Необходимо убедиться, что строки и столбцы указаны в виде строки.
{{form.text(cols="35", rows="20")|safe}}
работает
В 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;
}
Гораздо проще; используйте аргумент 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() }}
Для удобства сначала добавьте этот макрос.
_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>
Надеюсь, что это поможет!
Вот пример:
<div class="row">
<div class="col-md-12">
<div class="form-group">
{{ wtf.form_field(form.notes, rows=5) }}
</div>
</div>
</div>
Вы можете просто использовать этот замещающий виджет, который запоминает значения по умолчанию для рендеринга:
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.
Мне удалось изменить строки и столбцы с помощью тега 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>
Я просмотрел код и обнаружил, что класс Field определяет как __new__
, так и __init__
. __new__
берет кучу *args
и **kargs
. Таким образом, вы можете просто передать rows=x cols=y
в свой файл TextAreadField, и он должен работать. Я заметил, что wtforms создает для таких случаев класс под названием "UnboundField", я не знаю последствий этого, поскольку это может вызвать проблемы, если они есть. Но следующий шаг создания TextAreaField будет таким же. (Это управление переходит к вызову __init__
как и раньше.)