标签: wtforms

wtforms表单类子类和字段顺序

我有一个UserForm类:

class UserForm(Form):
    first_name = TextField(u'First name', [validators.Required()])
    last_name = TextField(u'Last name', [validators.Required()])
    middle_name = TextField(u'Middle name', [validators.Required()])
    username = TextField(u'Username', [validators.Required()])
    password = TextField(u'Password', [validators.Required()], widget=PasswordInput())
    email = TextField(u'Email', [validators.Optional(), validators.Email()])
Run Code Online (Sandbox Code Playgroud)

并希望在UpdateUserForm中使密码字段成为可选:

class UpdateUserForm(UserForm):
    password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
Run Code Online (Sandbox Code Playgroud)

但密码字段位于电子邮件字段之后,而不是之前.

如何在子类化时保留字段顺序?

此外,当我尝试更改密码字段验证器时它不起作用 - 密码仍然是必需的:/为什么?

class UpdateUserForm(UserForm):
    def __init__(self, **kwargs):
        self.password.validators = [validators.Optional()]
        super(UpdateUserForm, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

要么

class UpdateUserForm(UserForm):
    def __init__(self, **kwargs):
        self.password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
        super(UpdateUserForm, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)

一些想法......

class UpdateUserForm(UserForm):
    def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
        self._unbound_fields[4][1] = TextField(u'Password', …
Run Code Online (Sandbox Code Playgroud)

python subclassing wtforms

15
推荐指数
2
解决办法
7158
查看次数

使用FieldList和FormField

我们有以下表格,我们正在尝试GroupRoleForms为每个组创建列表.

class FullNameMixIn():
    full_name = TextField(
        'Full name', [
            validators.required(message=u"Full name is required")
        ])

class GroupRoleForm(Form):
    group =BooleanField('Group', default=False)
    role = SelectField(
            'Role',choices=[
            ("none", "----------"), 
            ('approver', 'Approver'),
            ('editor', 'Editor')
            ])

class AdminEditUserForm(Form, FullNameMixIn):
    group_roles = FieldList(FormField(GroupRoleForm))
Run Code Online (Sandbox Code Playgroud)

我们如何创建一个AdminEditUserForm包含预先填充的列表的实例GroupRoleForms

目前我们正试图这样做:

form = forms.AdminEditUserForm()
for group in  company.groups:
    group_role_form = forms.GroupRoleForm()
    group_role_form.group.label =  group.name
    group_role_form.group.name = group.id
    form.group_roles.append_entry(group_role_form)
return dict(edit_user_form = form )
Run Code Online (Sandbox Code Playgroud)

python wtforms

14
推荐指数
2
解决办法
6969
查看次数

我无法导入Flask-WTF TextField和BooleanField

我正在使用virtualenv来建立一个新项目.我在脚本文件夹中使用virtualenv pip安装了很多东西,如下所示:

flask\scripts\pip install Flask-WTF
Run Code Online (Sandbox Code Playgroud)

我没有在全局python文件夹中安装其他软件包.我的代码看起来像这样:

# Importing TextField and BooleanField is not working...
from flask.ext.wtf import Form, TextField, BooleanField
from flask.ext.wtf import Required


class LoginForm(Form):
    openid = TextField('openid', validators=[Required()])
    remember_me = BooleanField('remember_me', default=False)
Run Code Online (Sandbox Code Playgroud)

和其他软件包一样,sqlalchemy也只安装在虚拟环境中.

我得到的错误是:

(flask) D:\Development\grading>flask\Scripts\python.exe restserver.py Traceback (most recent call last):
File "restserver.py", line 1, in <module> from app import app
File "D:\Development\grading\app\__init__.py", line 12, in <module> from forms import LoginForm
File "D:\Development\grading\app\forms.py", line 1, in <module> from flask.ext.wtf import Form, TextField, BooleanField
File "D:\Development\grading\flask\lib\site-packages\flask\exthook.py", line 87, …
Run Code Online (Sandbox Code Playgroud)

python import flask wtforms flask-wtforms

14
推荐指数
2
解决办法
2万
查看次数

使用SQLAlchemy模型的WTForms中的唯一验证器

我在使用SQLALchemy管理数据库操作的应用程序中定义了一些WTForms表单.

例如,用于管理类别的表单:

class CategoryForm(Form):
    name = TextField(u'name', [validators.Required()])
Run Code Online (Sandbox Code Playgroud)

这是相应的SQLAlchemy模型:

class Category(Base):
    __tablename__= 'category'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(255))

    def __repr__(self):
        return '<Category %i>'% self.id

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

我想在表单验证上添加一个唯一约束(不在模型本身上).

阅读WTForms文档,我找到了一种简单类的方法:

class Unique(object):
    """ validator that checks field uniqueness """
    def __init__(self, model, field, message=None):
        self.model = model
        self.field = field
        if not message:
            message = u'this element already exists'
        self.message = message

    def __call__(self, form, field):         
        check = self.model.query.filter(self.field == field.data).first()
        if check:
            raise …
Run Code Online (Sandbox Code Playgroud)

validation sqlalchemy unique wtforms

13
推荐指数
2
解决办法
6255
查看次数

WTForms创建可变数量的字段

我如何用不同的问题动态创建一些表单字段,但答案相同?

from wtforms import Form, RadioField
from wtforms.validators import Required

class VariableForm(Form):

    def __init__(formdata=None, obj=None, prefix='', **kwargs):
        super(VariableForm, self).__init__(formdata, obj, prefix, **kwargs)
        questions = kwargs['questions']
        // How to to dynamically create three questions formatted as below?

    question = RadioField(
            # question ?,
            [Required()],
            choices = [('yes', 'Yes'), ('no', 'No')],
            )

questions = ("Do you like peas?", "Do you like tea?", "Are you nice?")  
form = VariableForm(questions = questions)
Run Code Online (Sandbox Code Playgroud)

python wtforms

13
推荐指数
1
解决办法
5654
查看次数

禁用字段被认为是在WTForms和Flask中进行验证

我在页面中禁用了一些字段,例如:(使用jinja2模板系统)

<html>
<body>
<form action="" method=POST>
    {{ form.name(disabled=True) }}
    {{ form.title }}
    -- submit button --
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

字段按预期在表单中禁用.

在我的views.py中:在表单提交上执行validate_on_submit()时,它在"name"字段上的验证错误失败,该字段被禁用.我希望验证忽略禁用字段.这是正确的行为吗?如果是的话,请你知道如何处理这种情况吗?

更新:

class TeamForm(wtf.Form):
    name = wtf.TextField("Team Name", validators=[validators.Required()])
    title = wtf.TextField("Title", validators=[validators.Required()])
Run Code Online (Sandbox Code Playgroud)

python jinja2 flask wtforms

13
推荐指数
1
解决办法
1万
查看次数

WTForms RadioField默认值

我正在使用这样的wtforms生成一个html表单:

<div class="control-group">
    {% for subfield in form.time_offset %}
    <label class="radio">
        {{ subfield }}
        {{ subfield.label }}
    </label>
    {% endfor %}
</div>
Run Code Online (Sandbox Code Playgroud)

我的表单类是这样的:

class SN4639(Form):
    time_offset = RadioField(u'Label', choices=[
        ('2', u'Check when Daylight saving has begun, UTC+02:00'),
        ('1', u'Check when Daylight saving has stopped, UTC+01:00')],
        default=2, validators=[Required()])
Run Code Online (Sandbox Code Playgroud)

当我现在打开编辑表单时,我通过SQL获得值1或2 - 如何预设特定的单选按钮?

python wtforms

13
推荐指数
2
解决办法
7079
查看次数

使用WTForms FieldList

我通过Flask.WTF扩展使用带有Flask的WTForms.不过,这个问题不是Flask特有的.

WTForms包括FieldList字段列表的字段.我想用它来制作一个用户可以添加或删除项目的表单.这将需要某种Ajax框架来动态添加小部件,但WTForms文档没有提及它.

Deform这样的其他框架也支持Ajax.WTForms是否有类似的框架?

python forms ajax flask wtforms

12
推荐指数
1
解决办法
8615
查看次数

自动剥离()WTForms中的所有值?

有没有办法从WTForms中的所有值中去除周围的空格而不向每个字段添加过滤器?

目前我正在将filters=[strip_whitespace]下面显示的功能传递给我的字段,但是必须为每个字段重复此操作非常难看.

def strip_whitespace(s):
    if isinstance(s, basestring):
        s = s.strip()
    return s
Run Code Online (Sandbox Code Playgroud)

需要子类化的解决方案Form很好,因为我已经在我的应用程序中这样做了.

python wtforms

12
推荐指数
2
解决办法
2799
查看次数

将瓶子形式自定义为表格

我一直在咬这个钉子很长一段时间.在我的Flask-app中,我目前有一个产品数据库,在应用程序中我有一个页面,可以将每个产品列查询到一个表中.

例如,我有1234可以查看详细信息(即数据库列)的产品,example.com/items/1234其中包含以下内容:

<div class="container">
  <div class="content">
  <a href="/item">Back</a>
  <table class="table">
  <thead>
    <tr>
      <th>#</th>
      <th>Value</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Detail-1<th>
      <td>Example</td>
    </tr>
    <tr>
       <th scope="row">Detail-2</th>
       <td>Example</td>
    </tr>
Run Code Online (Sandbox Code Playgroud)

我正在努力的是以下几点:

我希望能够添加具有相同表格风格的新产品.为此,我创建了一个如下形式:

class NewArticleForm(FlaskForm):
    detail_1 = StringField("Detail-1")
    detail_2 = IntegerField("Detail-2")
    ...
    submit = SubmitField("Submit")
Run Code Online (Sandbox Code Playgroud)

我现在完全失去了如何在模板中自定义表单外观{{ wtf.quick_form(form) }}.我尝试的是以下内容:

<form method="POST">
<table class="table">
  {% for name in form %}
  <tr>
    <th scope="row">{{ name.label }}</th>
    <td>{{ name }}</td>
  </tr>
  {% endfor %}
 </table>
 </form>
Run Code Online (Sandbox Code Playgroud)

该表看起来不错(至少是那个),但我认为请求没有正确发送.页面加载正确,"POST /url HTTP/1.1"但似乎没有正确.

我的意思是,尽管请求正确发送,我可以看到我是否通过Flask服务器运行应用程序.但是,似乎没有任何内容传输到数据库.页面只是重新加载输入的数据仍然在字段中,没有任何内容传输到数据库.如果我只是使用 …

python flask wtforms

12
推荐指数
1
解决办法
869
查看次数