标签: wtforms

可变长度元素的动态形式:wtforms

我正在使用 wtforms,我需要创建一个可以根据数据库中的信息生成表单定义的东西;动态表单创建。我逐渐意识到需要做什么,而我才刚刚开始。我可以创建表单并将它们与 wtforms/flask 一起使用,但是根据数据定义表单(从表单到表单略有不同)目前超出了我目前的技能水平。

有没有人做过这个并提供一些意见?有点模糊的问题,还没有实际的代码。我还没有找到任何例子,但也不是不可能做到。

mass of variable data to be used in a form --> wtforms ---> form on webpage
Run Code Online (Sandbox Code Playgroud)

编辑:

因此,“例如”我们可以使用调查。一个调查由几个 SQLAlcehmy 模型组成。调查是具有任意数量关联问题模型的模型(问题属于调查,例如多项选择问题,它变得复杂)。为了简化,让我们使用简单的 json/dict 伪代码:

{survey:"Number One",
    questions:{
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:text, field:"Place your X here"}
     } 
 }

{survey:"Number Two",
    questions:{
        question:{type:text, field:"Answer the question"},
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:text, field:"Place your email address here"}
     } 
 }
Run Code Online (Sandbox Code Playgroud)

想象一下,而不是这个,数百个不同长度的 5+ 字段类型。如何使用 WTForms 为此管理表单,或者我什至需要使用 wtforms?我可以根据需要定义静态表单,但不能动态定义。

顺便说一句,我在 rails 中使用 simpleform …

python forms wtforms

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

WTForms-JSON 与使用 FormField 的可选嵌套

我正在使用WTForms-JSON并处理嵌套表单。我想让内部表单可选,但如果存在内部表单,我希望它的字段是必需的。我遇到的问题是FormField不接受验证器。

(虽然我使用的是 WTForms-JSON,但我相信这也适用于 vanilla WTForms。)

这段代码有效,但不符合我想要的方式:

class InnerForm(Form):
    foo_id = IntegerField("Foo ID", [Required()])

class OuterForm(Form):
    inner = FormField(InnerForm)
Run Code Online (Sandbox Code Playgroud)

上面代码的问题inner是隐式需要。奇怪的是,虽然validate()回报率Falseinner被省略了,errors是空的。

此代码不起作用:

class InnerForm(Form):
    foo_id = IntegerField("Foo ID", [Required()])

class OuterForm(Form):
    inner = FormField(InnerForm, "Inner", [Optional()])
Run Code Online (Sandbox Code Playgroud)

后者产生此错误:

TypeError: FormField does not accept any validators. Instead, define them on the enclosed form.
Run Code Online (Sandbox Code Playgroud)

我的问题是:我怎样才能使inner可选,但foo_id如果inner存在则需要?

wtforms wtforms-json

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

如何查看 WTForms 验证错误?

我正在编写一些基本测试并且测试失败。

def test_new_user_registration(self):
  self.client.get('/user/register')
  form = RegistrationForm(
    email=u'crow@crow.com',
    first_name=u'Alex',
    last_name=u'Frazer',
    username=u'crow',
    password=u'fake_password',
    confirm_password=u'fake_password'
  )
  self.assertTrue(form.validate())
Run Code Online (Sandbox Code Playgroud)

断言错误失败form.validate(),但如何查看验证错误是什么?

python testing unit-testing flask wtforms

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

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

WTForms-JSON 不适用于 FormFields

当我使用 WTForms-JSON 时,嵌套表单 (FormFields) 不会填充数据。我无法发现我的错误,请参见下面的示例。

from flask import Flask, request, jsonify
from flask_wtf import Form
from wtforms import TextField, FormField, IntegerField
from wtforms.validators import InputRequired
import wtforms_json

app = Flask(__name__)
app.config["WTF_CSRF_ENABLED"] = False
wtforms_json.init()


class Address(Form):
    street = TextField('street', validators=[InputRequired()])
    number = IntegerField('number', validators=[InputRequired()])


class User(Form):
    name = TextField('name', validators=[InputRequired()])
    address = FormField(Address, label='address')


@app.route('/', methods=['POST'])
def why_no_work():
    form = User()

    form.from_json(request.json)
    print form.data

    if form.validate():
        return jsonify(success='YEAH')
    else:
        return jsonify(errors=form.errors)


if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我发送以下 JSON 请求

{ …
Run Code Online (Sandbox Code Playgroud)

python flask python-2.7 wtforms wtforms-json

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

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

如何在带有 FormField 的 Flask/WTForms 中使用 populate_obj?

我有一个有位置的用户。就像概念证明一样,位置是应存储为用户模型的 CombinedForm 中的 FormField。最终我想要有相当多的嵌套表单,所以我真的很喜欢 form.populate_obj(Model) 来处理数据。但是,我一定是做错了什么。这是我的代码:

# - - - Models - - -
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40))
    location = db.relationship('Location', backref='user')

class Location(db.Model):
    __tablename__ = 'locations'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
    descr = db.Column(db.String(50))

# - - - Forms - - -
class LocationForm(NoCsrfForm):
    descr = StringField('Location Name')

class CombinedForm(Form):
    username = StringField('User', validators=[DataRequired()])
    location = FormField(LocationForm)  # , default=lambda: Location())
    submit = SubmitField('Submit')

# - - - …
Run Code Online (Sandbox Code Playgroud)

python formfield flask wtforms

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

将 Select2 与 flask-wtforms 一起使用

在 select2 操作下拉字段后,定期使用form.owner_id.datayields None。如何从 select2 字段中提取选定的选项。

如果我禁用 select2 javascript,wtforms 将正常工作,我将能够使用form.owner_id.data. (但看起来很丑)

渲染表单的屏幕截图

表格.py

class ProjectForm(FlaskForm):
    owner_id = SelectField('Owner:', [validators.Required()], choices=[], render_kw={"placeholder": "Owner company *"})
Run Code Online (Sandbox Code Playgroud)

(为简单起见,其余形式已被截断)

视图.py

@app.route('/new_project/<int:company_id>', methods=('GET', 'POST'))
def new_project(company_id):
    membership = Membership.query.filter_by(user_id=current_user.id, company_id=company_id).first()
    company = Company.query.filter_by(id=company_id).first_or_404() 
    form = ProjectForm()

    form.owner_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]

    form.client_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]

    form.contractor_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]

    form.membership_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]

    if request.method …
Run Code Online (Sandbox Code Playgroud)

javascript python flask wtforms jquery-select2

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

多个字段的 Flask WTform 验证

基于两个或多个条目验证 WTform 的最佳方法是什么?即在下面的表格中,我想验证数据库中不存在具有提供的名称和地址的公司。

class CompanyForm(FlaskForm):
    name=StringField('Company Name', validators=[DataRequired()])
    address=StringField('Street Address', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)

像这样的东西...

    def validate_name(self, name, address):
        company = Company.query.filter_by(name=name.data, address=address.data).first()
        if company is None:
            raise ValidationError('This company already exists in our database.')
Run Code Online (Sandbox Code Playgroud)

我通读了关于 SO 的文档和类似的问题,但我仍然无法弄清楚。

validation wtforms flask-wtforms

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

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