标签: flask-wtforms

在wtforms中调用validate时输入错误

我在行中有TypeError,我在表单上调用'validate()'.

错误是:

   Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/valery/projects/easy_booking/easy_booking/controllers/users.py", …
Run Code Online (Sandbox Code Playgroud)

python flask python-2.7 wtforms flask-wtforms

7
推荐指数
1
解决办法
3143
查看次数

从Fields数据中获取None而不是空字符串

我在WTForms表格中有这个字段

name = StringField('Name', validators = [Optional(), Length(max = 100)])
Run Code Online (Sandbox Code Playgroud)

当字段提交为空form.name.data时,将按预期包含空字符串.

有没有办法让它返回None而不是空字符串?这只是因为null在数据库中处理非常方便,如下所示update:

update t
set 
    name = coalesce(%(name)s, name),
    other = coalesce(%(other)s, other)
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,我不需要检查字段是否为空,并在SQL代码中的Python代码中采取相应的操作.在nullcoalesce解决了容易.

python wtforms flask-wtforms

7
推荐指数
1
解决办法
4143
查看次数

更新wtforms中的提交按钮文本

我有一个表单,将用于新的提交和更新.我的问题是关于提交按钮的文本.我想根据具体情况将文本更改为新提交新更新.这纯粹是提供信息的.

class Interview(Form):
    ...
    submit = SubmitField('New submit')  
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想避免创建一个具有完全相同字段的新类,只是因为提交文本.

python flask wtforms flask-wtforms

7
推荐指数
2
解决办法
2696
查看次数

我可以在__init__ wtforms中添加字段吗?

由于某种原因,我需要在里面声明一个字段,__init__()所以我可以制作任意类型的FormField.

举个例子form.py:

class PurchaseForm(Form):
    item_class = ItemForm
    transaction_items = FieldList(FormField(item_class),
                                  label='items',
                                  min_entries=1)

    def __init__(self, item_class, *args, **kwargs):
       super().__init__(*args, **kwargs)
       self.item_class = item_class
       self.transaction_items = FieldList(FormField(self.item_class),
                                           label='items',
                                           min_entries=1)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,该transaction_items字段不会被替换__init__(),我可以做一些事情来覆盖它吗?或者setattr为这个特定的例子做些什么?


编辑:这是我如何指定构造函数

import form

@app.route('/add/purchase-transaction', methods=['GET', 'POST'])
def add_purchase_transaction():
    form = forms.PurchaseForm(form.ItemForm)

    if form.validate_on_submit():
        # do something

    return render_template('add-purchase-transaction.html', form=form)
Run Code Online (Sandbox Code Playgroud)

所以我的目标是做一个PurchaseForm具有FieldList包含ItemForm窗体类,并在将来,我可以换ItemForm到不同的类,例如PurchaseItemForm

python wtforms flask-wtforms

7
推荐指数
1
解决办法
2767
查看次数

Flask-WTF动态选择字段将"无"作为字符串

我有一个空的选择字段,其中包含我在运行时定义的选项:

myfield = SelectField('myfield', validators=[Optional()])
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用看起来像这样的GET请求:

@app.route('/', methods=['GET'])
def myresponse():
    form = myform(csrf_enabled=False)
    form.myfield.choices = (('', ''), ('apples', 'apples'), ('pears', 'pears'))
Run Code Online (Sandbox Code Playgroud)

然后当我尝试在空表格上验证时.(我没有GET参数去myapp.com)

    if not form.validate():
        return search_with_no_parameters()
    else:
        return search_with_parameters(form) #this gets run
Run Code Online (Sandbox Code Playgroud)

当我的search_with_parameters函数尝试使用表单变量时,它会检查以确保它form.myfield.data不是Falsey(不是空字符串).如果它不是Falsey,则使用该参数进行搜索.如果为Falsey,则忽略该参数.但是,在空表单提交时,form.myfield.data"None"一个字符串."None"完成搜索.我可以验证"None"字符串,但我认为这首先打败了使用该模块的目的.有没有办法让它只返回一个空字符串或真正的None值?

wtforms flask-wtforms

7
推荐指数
2
解决办法
3234
查看次数

Flask / WTForms / QuerySelectField-使用基于现有数据库值选择的选项来呈现QuerySelectField

我正在构建一个包含配置文件管理页面的简单CMS。在此配置文件页面以及其他字段上,存在一个下拉列表,我使用wtforms扩展的QuerySelectField从表“ parks”生成该列表:

from wtforms.ext.sqlalchemy.fields import QuerySelectField
Run Code Online (Sandbox Code Playgroud)

配置文件页面上的其余字段由“用户”表填充。

假设用户已经登录,并且在“用户”表中的记录已经填充。“用户”表中的字段中有一个外键,用于表示“公园”表中的值:“ park_id”。

当登录的用户导航到其个人资料页面时,我想在下拉菜单中显示与该用户的park_id外键值相对应的选择。

请注意,Flask / Python等对我来说是非常新的。另外,我使用的是Flask-Security,下面的User模型基于他们的示例。也许我需要与用户/公园建立另一种关系?

对我来说,显示用户保存的配置文件信息(包括可能显示在下拉列表中以供编辑的信息)似乎很基本。我担心我缺少基本的东西。到目前为止,关于SO以及其他方面的其他类似问题/答案对我来说似乎令人困惑。

我的用户模型:

# Define models
roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(255))

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    active = db.Column(db.Boolean())
    confirmed_at = db.Column(db.DateTime())
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))
    park_id = db.Column(db.Integer)
    weather_zip = db.Column(db.String(255))
    flickr_api_key = db.Column(db.String(255))
    flickr_api_secret = …
Run Code Online (Sandbox Code Playgroud)

python flask-sqlalchemy flask-wtforms

7
推荐指数
1
解决办法
3668
查看次数

使用 React Form、Flask 服务器和 Flask-WTF 保护 CSRF

TL;DR 我需要保护我的表单免受 CSRF 攻击,我想在前端使用 ReactJS,在后端使用 Flask/Flask-WTF。

我正在重构一个使用 Python、Flask 和 Flask-WTF 构建的用于表单的网站,我想将 React 用于前端,而不是通过 PyPugjs 使用 Jinja2。我正在使用 Flask-WTF 来呈现表单,它负责处理 CSRF 令牌等。我知道如何使用 React 制作表单,但如何获得 CSRF 保护?

现在我的表单渲染看起来像这样:(使用 Pug)

mixin render_form(form, id='', action='Submit')
    form(method='POST', action='', id=id)
        =form.csrf_token

        each field in form
            fieldset
                if field.errors
                    each error in field.errors
                        .notification.error
                            #{error}

                #{field(placeholder=field.label.text)}

        button(type='submit') #{action}
Run Code Online (Sandbox Code Playgroud)

javascript csrf-protection flask-wtforms reactjs

6
推荐指数
2
解决办法
3202
查看次数

禁用 WTForms SelectField 中的选项之一

将“禁用”html 属性分配给 WTForms 中 SelectField 中的选项之一的最简单方法是什么?

这是我之前的代码

<select class="form-control" name="division" data-error="Required!" required>
     <option value="default" disabled selected>Select something</option>
     <option value="option1">Option 1</option>
     <option value="option2">Option 2</option>
 </select>
Run Code Online (Sandbox Code Playgroud)

如您所见,我只想将“禁用”设置为第一个选项。

我这个任务的代码是:

next(form.division.__iter__())(**{'disabled':'true'})
Run Code Online (Sandbox Code Playgroud)

在控制台中使用打印功能我可以看到正确的输出:

<option disabled="true" selected value="default">Select something</option>
Run Code Online (Sandbox Code Playgroud)

该行正在工作,但不知何故此输出未传递给模板。相反,这是通过的:

<option selected value="default">Select something</option>
Run Code Online (Sandbox Code Playgroud)

请有人说清楚。

python flask-wtforms

6
推荐指数
2
解决办法
3794
查看次数

Flask wtforms - “UnboundField”对象不可调用,动态字段将无法正确初始化

应用程序.py

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, FieldList, FormField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'apple pie'


class BookForm(FlaskForm):
    book = StringField('book title')


class LibraryForm(FlaskForm):
    def __init__(self, min_entries=0, *args, **kwargs):
        super(LibraryForm, self).__init__(*args, **kwargs)
        self.books = FieldList(FormField(BookForm), min_entries=min_entries)

    library = StringField('Library name')
    books = FieldList(FormField(BookForm), min_entries=3)
    submit = SubmitField('Submit')


@app.route('/book', methods=['GET', 'POST'])
def book():
    form = LibraryForm(min_entries=5)
    if form.validate_on_submit():
        return 'aww yeah'
    return render_template('books.html', form=form)
Run Code Online (Sandbox Code Playgroud)

书籍.html

<html>
<form method="POST" action="">
    {{ form.hidden_tag() }}
    <div>{{ …
Run Code Online (Sandbox Code Playgroud)

flask wtforms flask-wtforms

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

如何在quick_form烧瓶引导程序中将类添加到标签

使用quick_form Flask-Bootstrap生成的形式对我来说是非常方便的,但是,我不能在他们找到的文档的方式,我可以额外类添加到label所要求的我的模板主题。

我的 forms.py 类如下所示:

from flask_wtf import Form
from wtforms import StringField,PasswordField,TextField,SubmitField
from wtforms.validators import InputRequired,EqualTo,Email,ValidationError

class Building_Form(Form):
    BuildingName = TextField('Building Name')
    BuildingType = TextField('Building Type')
    FloorNums    = TextField('Numers of Floor')
    BuildUnits   = TextField('Units in Building')
    BuildSize    = TextField('Building Size')
    BuiltYear    = TextField('Built in (year)')
    BuildOpeningTime = TextField('Open Time')
    BuildClosingTime = TextField('Close Time')
Run Code Online (Sandbox Code Playgroud)

我的routes.py如下所示:

from app.import_core import *
from flask_wtf import FlaskForm
from wtforms import Form, BooleanField, StringField, PasswordField, validators
from …
Run Code Online (Sandbox Code Playgroud)

flask python-2.7 flask-wtforms flask-bootstrap

6
推荐指数
1
解决办法
2640
查看次数