我有一个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) 我们有以下表格,我们正在尝试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) 我正在使用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) 我在使用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) 我如何用不同的问题动态创建一些表单字段,但答案相同?
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) 我在页面中禁用了一些字段,例如:(使用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) 我正在使用这样的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 - 如何预设特定的单选按钮?
我通过Flask.WTF扩展使用带有Flask的WTForms.不过,这个问题不是Flask特有的.
WTForms包括FieldList字段列表的字段.我想用它来制作一个用户可以添加或删除项目的表单.这将需要某种Ajax框架来动态添加小部件,但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很好,因为我已经在我的应用程序中这样做了.
我一直在咬这个钉子很长一段时间.在我的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服务器运行应用程序.但是,似乎没有任何内容传输到数据库.页面只是重新加载输入的数据仍然在字段中,没有任何内容传输到数据库.如果我只是使用 …
wtforms ×10
python ×9
flask ×4
ajax ×1
forms ×1
import ×1
jinja2 ×1
sqlalchemy ×1
subclassing ×1
unique ×1
validation ×1