我在行中有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) 我在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代码中采取相应的操作.在null与coalesce解决了容易.
我有一个表单,将用于新的提交和更新.我的问题是关于提交按钮的文本.我想根据具体情况将文本更改为新提交和新更新.这纯粹是提供信息的.
class Interview(Form):
...
submit = SubmitField('New submit')
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想避免创建一个具有完全相同字段的新类,只是因为提交文本.
由于某种原因,我需要在里面声明一个字段,__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
我有一个空的选择字段,其中包含我在运行时定义的选项:
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值?
我正在构建一个包含配置文件管理页面的简单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) 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) 将“禁用”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)
请有人说清楚。
应用程序.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) 使用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)