标签: wtforms

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

Jinja、Flask 和 WTForms:如何在字段中传递参数?

我正在关注本教程http://flask.pocoo.org/docs/0.10/patterns/wtforms/

这是一个带有宏的 _formhelpers.html 模板示例:

{% macro render_field(field) %}
  <dt>{{ field.label }}
  <dd>{{ field(**kwargs)|safe }}
  {% if field.errors %}
    <ul class=errors>
    {% for error in field.errors %}
      <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
  </dd>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

这里的 register.html 模板利用了 _formhelpers.html 模板:

{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
  <dl>
    {{ render_field(form.username) }}
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{ render_field(form.confirm) }}
    {{ render_field(form.accept_tos) }}
  </dl>
  <p><input type=submit value=Register>
</form>
Run Code Online (Sandbox Code Playgroud)

它最终生成了一个序列:

<dt><label for="email">Email Address</label> …
Run Code Online (Sandbox Code Playgroud)

python jinja2 flask wtforms flask-wtforms

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

wtforms 验证下拉值

我正在使用 Flask 和 WTForms 组合一个表单,但是,当涉及到下拉列表时,我希望每个下拉列表都有一个“请选择”选项,根据选定的原因验证需要为假,例如一个值尚未被选中。

我是否需要使用正则表达式验证或自定义验证来实现这一点?如果我确实需要自定义验证,那么我该如何构建一个?

CAR_MAKES = [('-1', "Please select a vehicle make..."), (1, 'Honda'),
(2, 'Ford'), (3, 'BMW')]
dd_car_makes = SelectField('dd_car_makes', choices=CAR_MAKES,
validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)

python flask wtforms

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

将 WTForms 与 Enum 一起使用

我有以下代码:

class Company(enum.Enum):
    EnterMedia = 'EnterMedia'
    WhalesMedia = 'WhalesMedia'

    @classmethod
    def choices(cls):
        return [(choice.name, choice.name) for choice in cls]

    @classmethod
    def coerce(cls, item):
        print "Coerce", item, type(item)
        if item == 'WhalesMedia':
            return Company.WhalesMedia
        elif item == 'EnterMedia':
            return Company.EnterMedia
        else:
            raise ValueError
Run Code Online (Sandbox Code Playgroud)

这是我的 wtform 字段:

company = SelectField("Company", choices=Company.choices(), coerce=Company.coerce)
Run Code Online (Sandbox Code Playgroud)

这是在我的表单中生成的 html:

<select class="" id="company" name="company" with_label="">
    <option value="EnterMedia">EnterMedia</option>
    <option value="WhalesMedia">WhalesMedia</option>
</select>
Run Code Online (Sandbox Code Playgroud)

不知何故,当我点击提交时,我不断收到“不是一个有效的选择”。

任何想法为什么?

这是我的终端输出:

当我查看我的终端时,我看到以下内容:

Coerce None <type 'NoneType'>
Coerce EnterMedia <type 'unicode'>
Coerce EnterMedia <type 'str'>
Coerce WhalesMedia …
Run Code Online (Sandbox Code Playgroud)

python enums flask wtforms

5
推荐指数
2
解决办法
3874
查看次数

表单验证失败时重定向(Flask-WTForms)

我正在尝试将 Flask-WTF 用于我添加到我最近继承的 Flask 应用程序的新表单。我对 Flask 生态系统相当陌生(对 WTForms 完全陌生),四年来我没有做过任何 Web 开发。

Flask-WTF 文档中的示例代码在表单验证失败时呈现页面,而不是重定向(Post/Redirect/Get)。此时,浏览器刷新将重新提交之前的 POST。这不好,对吧?虽然大多数人似乎没有对这种情况给予任何关注,但我确实看到一些人认为这是需要避免的(例如这里这里)。

那么在使用 Flask-WTF 时如何避免这个问题呢?如果我在验证失败时重定向,我想我将失去在每个字段上显示验证错误的能力。或者也许我不应该担心这种情况?

post-redirect-get flask wtforms flask-wtforms

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

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