标签: wtforms

wtforms.BooleanField 的 DataRequired 验证器已损坏

我使用 WTForms(与 Flask、flask-wtf、sqlalchemy 一起)来验证 REST API 传入的 JSON。我意识到 WTForms 的目标更多是 HTML 表单渲染和验证,但我选择它是因为它可以从我的 sqlalchemy 模型中自动生成表单(感谢 wtforms.ext.sqlalchemy)。

无论如何,问题就在这里。我的模型之一包括布尔字段,它使用 DataRequired 验证器转换为 wtforms.BooleanField。问题是,即使我传递了正确的数据,验证也会失败,并显示“此字段为必填项”错误消息。我的表格:

class MyForm(Form):
    name = TextField('name', validators=[DataRequired()])
    disabled = BooleanField('disabled', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)

JSON数据是这样的:

'{"name": "John", "disabled": "false"}'
Run Code Online (Sandbox Code Playgroud)

我期待什么:

  1. {"disabled": "false"}-> 验证成功的强制 Python 数据:{'disabled': False}
  2. {"disabled": "true"}-> 验证成功的强制 Python 数据:{'disabled': True}
  3. {"disabled": ""}'{"disabled": "foo"}'-> 验证失败

目前在第一种情况下验证失败{'disabled': [u'This field is required.']}

我知道文档中有一条注释说DataRequired验证器“需要强制数据,而不是输入数据”,但是 1)表单是自动生成的wtforms.ext.sqlalchemy,2)如果我使用验证器,它应该如何表现InputRequired?检查(通过form.validate()某些数据是否存在,然后检查该数据是“真”还是“假”?

总而言之,我的问题是:

  1. 正确的验证方法是什么wtforms.BooleanField …

python validation json wtforms

5
推荐指数
1
解决办法
2823
查看次数

WTForms - 通过将参数传递给构造函数来动态标签?

是否可以通过将参数传递给表单构造函数来使我的表单标签动态化?

我正在考虑类似于以下代码的内容:

class MyForm(Form):

    def __init__(self, fruit):
        Form.__init__(self)
        self.fruit = fruit

    name = StringField('Do you like' + fruit + "?")

@app.route('/' ,methods=["GET","POST"])
def home():
    form = NameForm("bananas")
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,文本输入框的标签似乎永远无法访问变量“fruit” - 即我似乎无法使标签动态化。

可能只是因为我对 Python 对象的理解不够深入,无法理解为什么这是不可能的。

python wtforms flask-wtforms

5
推荐指数
0
解决办法
1173
查看次数

如何在 Flask 中使用 WTForms 获取值列表?

在我使用Flask构建的网站中,我使用WTForms来验证提交的表单。在一种表单中,我使用如下表单提交值列表(隐藏字段是使用 js 在客户端生成的):

<form action="" method="post" id="prop-form">
    <input type="hidden" name="ids[]" value="54511ea9c1a36b4e910ce52a">
    <input type="hidden" name="ids[]" value="54511ea9c1a36b4e910ce52d">
    <input id="title" name="title" size="30" type="text" value="">
    <input type="submit" value="Save this form">
</form>
Run Code Online (Sandbox Code Playgroud)

ids[]在 Flask 方面,我可以使用以下代码轻松获取内容:

print request.form
print request.form.getlist('ids[]')
Run Code Online (Sandbox Code Playgroud)

打印出:

ImmutableMultiDict([('ids[]', u'54511ea9c1a36b4e910ce52a'), ('ids[]', u'54511ea9c1a36b4e910ce52d'), ('title', u'Blablabla')])
[u'54511ea9c1a36b4e910ce52a', u'54511ea9c1a36b4e910ce52d']
Run Code Online (Sandbox Code Playgroud)

但是当我在我的 wtform 中创建SelectMultipleField如下时:

ids = SelectMultipleField('ids[]')
Run Code Online (Sandbox Code Playgroud)

然后尝试获取这些值,我得到一个空列表:

print form.ids.data  # prints out []
Run Code Online (Sandbox Code Playgroud)

知道如何模仿request.form.getlist('ids[]')使用 WTForms 的行为吗?欢迎所有提示!

python werkzeug flask wtforms flask-wtforms

5
推荐指数
0
解决办法
4273
查看次数

sqlalchemy.exc.InterfaceError:&lt;不可打印的 InterfaceError 对象&gt;

sqlalchemy.exc.InterfaceError: <unprintable InterfaceError object>我正在尝试 Flask,但在提交 wtforms 时遇到错误。模型类是:

 class Post(db.Model):
__tablename__ = 'blog_posts'
id = db.Column(db.Integer, unique=True, primary_key=True)
title = db.Column(db.String(50), unique=False)
content = db.Column(db.Text, unique=False)
user_id = db.Column(db.String, db.ForeignKey('users.username'))



@staticmethod
def post_new_entry(title, content, user_id):
    """ Post new entry to database """
    new_post = Post(title=title, content=content, user_id=user_id)
    db.session.add(new_post)
    db.session.commit()
    return new_post

def __repr__(self):
    return 'PostID {}: {} by {}'.format(self.id, self.title, self.user_id)
Run Code Online (Sandbox Code Playgroud)

对于我的表格,我有以下内容:

class PostForm(Form):
title = StringField('Title', validators=[DataRequired(), Length(10, 65)])
post_content = TextAreaField('Content', validators=[DataRequired(), Length(50, 500)])
submit = SubmitField('Publish Post') …
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-sqlalchemy flask-wtforms

5
推荐指数
1
解决办法
8874
查看次数

Flask WTForms - 来自数据库的动态布尔字段

在我的flask项目中,我有views.py、models.py(SQLAlchemy到postgres)和forms.py文件。我一直在 form.py 中定义表单并从views.py 实例化它们。

我能够为 SelectField 创建动态内容,但很难为 BooleanField 创建动态内容。这是我正在尝试做的事情:

创建一个从团队中检索球员的表单(在数据库中)。为每个玩家创建一个 BooleanField。如果数据库中的“active”字段为1,则该值被选中(true),否则为未选中(false)。系统用户可以选中/取消选中任何框,然后提交表格。

我对玩家进行迭代没有问题,但我似乎无法弄清楚如何为每个 BooleanField 生成唯一的名称(如果它们具有相同的名称,我只会返回一个值)。我还需要根据用户的活动状态动态传递默认值。

我做了一些研究,看到了一些关于匹配我的 ORM 模型的想法 - 但我并不是真的试图创建一个字段条目来为我的玩家匹配我的 ORM 模型中的每一列 - 只是试图提取一些数据并创建动态表单。

也许可以在 jinja2 模板中完成这一切,但这似乎不是最好的方法......

好的 - 现在尝试变得更基础,但仍然有问题 - BooleanField 总是返回 False:

形式.py:

class myform(Form):
    available = BooleanField('available')
    submit = SubmitField('Save')
Run Code Online (Sandbox Code Playgroud)

视图.py:

form = myform(available=True)
Run Code Online (Sandbox Code Playgroud)

网页.html

Available: {{ form.available }}
Run Code Online (Sandbox Code Playgroud)

当网页呈现时,复选框被选中(由于 available=True),我正在传递该复选框,但当我提交时,值返回为 False)。

我确实注意到奇怪的是,即使选中该框,渲染的 HTML -<input id="available" type="checkbox" value="y" name="available" checked="">

Checked="" 对我来说没有意义。我注意到,当我删除“available=True”时,就没有checked=“”。我认为正确的 HTML 应该被检查=检查..

python flask wtforms

5
推荐指数
0
解决办法
1861
查看次数

Python 子类化 - 如何更新另一个类属性使用的类属性

假设有一个类属性是根据另一个类属性计算的:

class ClassA(object):
    attr1=5
    attr2=attr1+10

>>ClassA.attr2
15
Run Code Online (Sandbox Code Playgroud)

然后在子类中,我想更新第一个类属性以导致第二个类属性发生更改,而不重新定义第二个类属性。例如:

class ClassB(ClassA):
    attr1=10
Run Code Online (Sandbox Code Playgroud)

我希望发生的是:

>>ClassB.attr2
20
Run Code Online (Sandbox Code Playgroud)

然而,情况并非如此,因为 attr2 是在重新定义 attr1 之前计算的。有没有办法在不重新定义第二个属性的情况下获得这种行为?

(我的特定用例是使用从 Form 类属性派生的 Field 属性(格式、选择等)定义 WTForm,因此我可以对基本 Form 进行子类化并更改这些属性,而无需重新定义整个 Field。)

python inheritance attributes subclass wtforms

5
推荐指数
1
解决办法
2014
查看次数

MultipleFileField wtforms

class AddProductForm(FlaskForm):
    product_pictures = MultipleFileField('Pictures')
    submit = SubmitField('Add Pictures')

    def product_add_pics():
        form = AddProductForm()
        if form.validate_on_submit():
            if form.product_pictures.data:
                for picture_upload in form.product_pictures.data:
                    print(type(picture_upload))
Run Code Online (Sandbox Code Playgroud)

形式:

<div class="form-group">
    {{ form.product_pictures.label() }}
    {{ form.product_pictures(class="form-control-file") }}
    {% if form.product_pictures.errors %}
        {% for error in form.product_pictures.errors %}
            <span class="text-danger">{{ error }}</span>
        {% endfor %}
    {% endif %}
</div>
Run Code Online (Sandbox Code Playgroud)

我总是将类型作为字符串。我怎样才能得到二进制文件?我使用 wtforms 中的 MultipleFileField。

python flask wtforms multiple-file-upload

5
推荐指数
1
解决办法
2210
查看次数

提交带有动态生成字段的 WTform

我有一个表单,用户可以在其中动态添加字段。提交此表单时,后端只能看到后端生成的字段

#forms.py

class ExpensesForm(FlaskForm):
    expense_name = StringField('Expense_Item', validators=[DataRequired()])
    cost = FloatField('Cost', validators=[DataRequired()])
    due_date = DateField('Due Date', format='%Y-%m-%d', validators=[DataRequired()], default=datetime.datetime.today().date())
    type = SelectField('Role', choices=[('mutual', 'Mutual'),
                                        ('personal#1', 'Personal #1'),
                                        ('personal#2', 'Personal #2')
                                        ])
Run Code Online (Sandbox Code Playgroud)

return render_template('index.html', form=form, ...)我正在通过从main.py到传递此表格 index.html

所有 4 个字段均通过以下方式生成:

<form class="form-horizontal" id="main-form" enctype=multipart/form-data role="form" method="post" action="/">
        <input type="hidden" name="count" value="1"/>
        {{ form.csrf_token }}

        {{ form.expense_name(placeholder="Expense Name", id="expense_1", value="") }}
        {{ form.cost(placeholder="Cost", id="cost_1", class="cost", value="") }}
        {{ form.due_date(id="due_date_1") }}
        {{ form.type(placeholder="Type", id="type_1") }}
        <button id="b1" class="btn btn-info add-more" …
Run Code Online (Sandbox Code Playgroud)

python flask wtforms

5
推荐指数
1
解决办法
2532
查看次数

如何在 python Flask 中验证 html 表单?

我在登录页面中有一个 HTML 表单,我想通过 ajax 将表单数据发送到 /data rout。
问题是在后端验证此 HTML 表单。
我知道 Flask WTF 表单,但使用这种方法会在后端生成表单,这不是我的情况。

from flask import Flask, request, url_for
...
@app.route("/data", methods=["GET", "POST"])
def get_data():
if request.method == "POST":
    username = request.form["username"]
    ...  
Run Code Online (Sandbox Code Playgroud)

我的 html 表单:

<form method="POST" action="">
<input type="text" name="username">
<input type="submit" value="Send">
</form>  
Run Code Online (Sandbox Code Playgroud)

一种困难的方法是使用正则表达式验证每个字段并为它们编写几个 if 条件。我想知道更简单的方法吗?

python flask wtforms flask-wtforms

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

当文件已经上传时预填充 Flask-WTF FileField

这是我想要实现的目标:

我希望能够通过包含多种不同类型字段(BooleandFields、StringFields 等)的表单来编辑数据库条目,其中有两个flask_wtf FileFields我希望在我预先填充(使用文件名)时本来已经上传文件,因此当我只想更改其他字段中的某些条目时,我不必重新上传相同内容的 x 份。

这是我的立场:

当我输入表单进行编辑时,所有其他字段(FileFields 除外)都已正确预填充。我可以使用 Flask-Uploads 和 UploadSet 的组合上传文件。通过一个flask_wtf.file FileField. 在我的数据库中,我将文件名和文件 url 保存为字符串。

我已经阅读了flask-wtf 文件上传以及WTForms 文档,我对模拟表单需要做的事情感到有点迷失,以便像我已经填充 FileField 一样

以下是我正在使用的代码片段:

  1. 初始化文件
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_bootstrap import Bootstrap
from flask_uploads import UploadSet, configure_uploads
[...]

app = Flask(__name__)

[...] 
csvfiles = UploadSet('csvfiles')
configure_uploads(app, (csvfiles,))

Run Code Online (Sandbox Code Playgroud)
  1. 表格.py

这里有问题的 FileFields 是:“dive_posiview”和“dive_ctd”

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, …
Run Code Online (Sandbox Code Playgroud)

python flask wtforms flask-uploads

5
推荐指数
0
解决办法
154
查看次数