9 回答
您不应该在声明小部件的地方执行此操作。你已经在模板中做到了。例如:
{{form.content(rows='50',cols='100')}}
需要确保将行和列指定为字符串。
简单得多;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() }}
nettuts+有一个关于 Flask 的教程。基本上,它是这样工作的:
from flask.ext import wtf
class ContactForm(wtf.Form):
content = wtf.TextAreaField("Content", [validators.Required()])
在你的 html 中:
<form action="" method="post">
{{ form.content }}
</form>
您可以在 css 中指定布局,而不是在 html 中指定布局,例如:
form textarea#content {
width: 100px;
height: 100px;
max-width: 100px;
}
{{form.text(cols="35", rows="20")|safe}}
正在工作中
这是一个例子:
<div class="row">
<div class="col-md-12">
<div class="form-group">
{{ wtf.form_field(form.notes, rows=5) }}
</div>
</div>
</div>
我能够通过 python 表单页面上的 render_kw 标签修改行和列。当我第一次在WTForm的网站上看到this的定义时,直到看到其他人使用this修改form元素的类的例子,我才知道它是做什么的。所以他们的定义只是让我感到困惑,直到我开始尝试它。
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 中呈现的。注意那里添加的“行”属性。
<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>
为方便起见,先添加此宏。
_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>
希望能帮助到你 !
您可以简单地使用这个记住渲染默认值的替换小部件:
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 的文本区域。
我查看了代码,发现 Field 类同时定义了__new__
和__init__
。__new__
需要一堆*args
and **kargs
。因此,您可以传入rows=x cols=y
您的 TextAreadField 创建,它应该可以工作。我注意到 wtforms 正在为这种情况创建一个名为“UnboundField”的类,我不知道这会导致问题(如果有的话)的含义。但是创建 TextAreaField 的下一步是相同的。(即控制__init__
像以前一样调用。)