【问题标题】:How to render my TextArea with WTForms?如何使用 WTForms 渲染我的 TextArea?
【发布时间】:2011-12-20 05:48:23
【问题描述】:

要使用 WTForms 以指定数量的列和行来呈现我的 textareafield,我如何设置列数和行数?我按照这个问题的说明进行操作,但没有奏效:

How to specify rows and columns of a <textarea > tag using wtforms

我尝试添加一个小部件,但没有成功:

class AForm(Form):
    name = TextField('Name', [validators.Length(min=4)])
    title = TextField('Title', [validators.Length(min=4)])
    text = TextAreaField('Text', widget=TextArea(row=70, cols=11))
    phonenumber = TextField('Phone number')
    phonenumberhide = BooleanField('Display phone number on site')
    price = TextField('Price')
    password = PasswordField('Password')
    email = TextField('Email', [
        validators.Length(min=6, message=_('Little short for an email address?')),
        validators.Email(message=_('That\'s not a valid email address.'))
    ])

TypeError: object.new() 没有参数

【问题讨论】:

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

标签: python wtforms


【解决方案1】:

非常老的问题,但由于 WTF-Form 文档不清楚,我发布了我的工作示例。 OP,希望你还没有在做这个。 :-)

表格

from flask_wtf import Form
from wtforms.fields import StringField
from wtforms.widgets import TextArea

class PostForm(Form):
    title = StringField(u'title', validators=[DataRequired()])
    body = StringField(u'Text', widget=TextArea())

模板

{% extends "base.html" %}
{% block title %}Create Post{% endblock %}
{% block content %}
<H3>Create/Edit Post</H3>
<form action="" method=post>
   {{form.hidden_tag()}}
   <dl>
      <dt>Title:
      <dd>{{ form.title }}
      <dt>Post:
      <dd>{{ form.body(cols="35", rows="20") }}}
   </dl>
   <p>
      <input type=submit value="Publish">
</form>
{% endblock %}

【讨论】:

  • 新版wtforms可以直接导入TextAreaFieldfrom wtforms import TextAreaField
【解决方案2】:

无需为此问题更新模板。您可以在TextAreaField 的定义中设置行和列。这是示例:\

class AForm(Form):
     text = TextAreaField('Text', render_kw={"rows": 70, "cols": 11})

对于render_kw,如果提供,将在渲染时将提供默认关键字的字典提供给小部件。

【讨论】:

  • 我试过上面的答案。你的是最好和最简单的。谢谢!
  • 谢谢!正是我需要的!此外,如果您想指定默认样式,还可以将'class_': 'some_default_css_class' 传递给render_kw={...}。如果需要,可以通过在模板中执行 @Jay 建议的操作来覆盖此默认样式:{{ form.fieldname(class_='some_override_css_class')}}
【解决方案3】:

TextArea 字段也可以在没有任何小部件的情况下实现:

forms.py

from wtforms import Form, TextField, TextAreaField

class ContactForm(Form):
    name = TextField('Name')
    email = TextField('Email Address')
    body = TextAreaField('Message Body')

template.html

... 
    <form method="POST" action="">
        {{ form.csrf_token }}
        {{ form.name.label }} {{ form.name(size=30) }} <br/>
        {{ form.email.label }} {{ form.email(size=30) }} <br/>
        {{ form.body.label }} {{ form.body(cols="35", rows="20") }} <br/>
        <input type="submit" value="Submit"/>
    </form>
...

【讨论】:

    【解决方案4】:

    我想在这里补充一点,上面建议使用 render_kw 的解决方案确实在未设置文本区域高度的条件下有效。

    所以如果你有一个字段:

        temp = TextAreaField('temp', render_kw={'rows':20})
    

    并在您的 HTML 文件中编写:

        {{ form.temp(class_='someclass' )}}
    

    那么在某些类的 CSS 定义中,不应设置高度,因为这会与您的行设置冲突,并且显然高度优先于行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多