标签: wtforms

Flask WTF-forms添加select和textarea

我正在尝试制作一个生成以下HTML的烧瓶形式:

<input type="text" name="title" class="field">
<textarea class="field"></textarea>
<select name="status">
    <option value="active">Active</option>
    <option value="inactive">Inactive</option>
</select>
Run Code Online (Sandbox Code Playgroud)

到目前为止,因为我是python的新手,所以我做到了这一点.

  {% from "forms/macros.html" import render_field %}
  <form method="POST" action="." class="form">
  {{ render_field(form.title, class="input text") }}
Run Code Online (Sandbox Code Playgroud)

我的问题是,到目前为止我对标题字段是否正确,并假设我有,请有人请解释我如何获得textarea和selectfield?我已经阅读了文档,我发现几乎无法理解它.

python forms flask wtforms flask-wtforms

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

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
查看次数

Flask-WTF model_form、Sqlalchemy 和外键

我正在尝试使用我的模型并使用 wtform 的 model_form for sqlalchemy 生成表单。我希望带有外键约束的字段是该表中所有项目的选择列表。

到目前为止,对于文字外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷茫。

好的,所以我这里有一个相对简单的数据模型。为此,我可以将其减少到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更多有用的描述。

from . import db
class Status(db.Model):
    """Support status"""
    __tablename__ = 'status'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    def __repr__(self):
        return self.name

class Hardware(db.Model):
    """Hardware"""
    __tablename__ = 'hardware'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    status = db.Column(db.Integer, db.ForeignKey('status.id'))
    ...
    def __repr__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

时髦。

现在我的观点是这样的:

from flask import render_template, request, flash, redirect, url_for
from flask_wtf import Form
from …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy wtforms flask-sqlalchemy flask-wtforms

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

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
查看次数

WTForms:如何将“自动对焦”属性添加到 StringField

我对 WTForms、Flask-WTF 比较陌生。我无法弄清楚如何从表单定义中简单地将 HTML5 属性“自动聚焦”添加到表单字段之一。我想在 Python 代码中这样做,而不是在 Jinja 模板中。这是我所拥有的:

class NameForm(Form):
    name1 = StringField("Nom d'utilisateur :",
                    validators=[Required(), Length(1, 16)])
    pwd1 = PasswordField("Mot de passe :",
                     validators=[Required(), Length(1, 16)])
    mail1 = StringField("Compte GMail du calendrier :",
                    validators=[Required(), Email()])
    submit = SubmitField('Envoyer')
Run Code Online (Sandbox Code Playgroud)

我只想将“autofocus”属性添加到“name1”字段中。

我在路线中试过这个:

@app.route('/', methods=['GET', 'POST'])
def form():
    name1 = None
    pwd1 = None
    mail1 = None
    msg = None
    # Tests
    Name_Form_kwargs = {"name1": "" ,"autofocus" :"true"}
    Name_Form = NameForm(**Name_Form_kwargs)
    print Name_Form.name1
    # 
    form = NameForm()
    .....
Run Code Online (Sandbox Code Playgroud)

但这只会更改字段值,不会添加任何属性:

<input id="name1" …
Run Code Online (Sandbox Code Playgroud)

python wtforms flask-wtforms

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

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
查看次数

提交带有动态生成字段的 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
查看次数