如何使用wtforms </textarea>指定<textarea>标记的行和列

时间:2011-02-08 07:53:55

标签: python wtforms

构造一个wtforms的TextAreaField是这样的:

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

如何指定与此textarea关联的行数和列数?

9 个答案:

答案 0 :(得分:14)

您不应该在声明窗口小部件的位置执行此操作。你已经在模板中做到了。例如:

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

需要确保将行和列指定为字符串。

答案 1 :(得分:4)

{{form.text(cols="35", rows="20")|safe}}正在运作

答案 2 :(得分:3)

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;
}

答案 3 :(得分:3)

以下是一个例子:

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

答案 4 :(得分:3)

更简单;创建字段时使用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 :(得分:1)

为方便起见,请先添加此宏。

_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 :(得分:1)

我能够通过python表单页面上的render_kw标记修改行和列。当我第一次在WTForm网站上看到此定义时,直到看到其他人使用此示例修改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>

答案 7 :(得分:0)

您可以简单地使用此替换窗口小部件来记住渲染的默认值:

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 textarea。

答案 8 :(得分:-1)

我查看了代码,发现Field类定义了__new____init____new__需要一大堆*args**kargs。因此,您可以在TextAreadField创建中传递rows=x cols=y,它应该可以工作。我注意到wtforms正在为这种情况创建一个名为“UnboundField”的类,我不知道这会导致问题的影响,如果有的话。但是创建TextAreaField的下一步是相同的。 (这是控制权转移到__init__之前。)