我在同一页面上有多个表单,将发送请求发送到烧瓶中的同一个处理程序.
我正在使用wtforms生成表单.
确定提交哪种表单的最佳方法是什么?
我目前正在使用action="?form=oneform".我认为应该有一些更好的方法来实现同样的目标?
几天前,我已经重置了我的本地烧瓶环境,而没有pip freeze在删除它之前通过a捕获了依赖关系.因此我不得不重新安装整个堆栈的最新版本.
现在突然之间,我无法再使用表单进行验证.Flask声称CSRF将丢失.
def register():
form = RegisterForm()
if form.validate_on_submit():
...
return make_response("register.html", form=form, error=form.errors)
Run Code Online (Sandbox Code Playgroud)
我第一次发送一个Get我form.errors按预期检索一个空.现在我填写表格并提交并form.errors显示:{'csrf_token': [u'CSRF token missing']}
这太奇怪了.我想知道Flask-WTF是否已经改变,我错误地使用它.
我可以清楚地看到form.CSRF_token存在,为什么它声称它丢失了?
CSRFTokenField: <input id="csrf_token" name="csrf_token" type="hidden" value="1391278044.35##3f90ec8062a9e91707e70c2edb919f7e8236ddb5">
Run Code Online (Sandbox Code Playgroud)
我从未触及过工作模板,但我在这里发布了它:
{% from "_formhelpers.html" import render_field %}
{% extends "base.html" %}
{% block body %}
<div class="center simpleform">
<h2>Register</h2>
{% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
<form class="form-signin" action="{{ url_for('register') }}" method=post>
{{form.hidden_tag()}}
<dl>
{{ render_field(form.name) }}
{{ render_field(form.email) …Run Code Online (Sandbox Code Playgroud) 我对wtforms和flask很新,并且正在搞乱selectfields并且出错了.表单本身在没有selectfield的情况下工作得很好但是有了它我得到以下错误:
错误:
....fields.py", line 386, in pre_validate
for v, _ in self.choices: TypeError: 'NoneType' object is not iterable
Run Code Online (Sandbox Code Playgroud)
我看到了选择字段,所以它正在被渲染.我怀疑在POST上没有正确验证id并且没有返回任何内容.或者它与我的selectfield元组返回有关?我正在使用的ID字段是从GAE的ndb自动密钥().id()中提取的,这是相当长且令人讨厌的.可能是用于选择字段的id长度太长了?
谷歌搜索没有提供太多的确切问题所以我想发布在这里.相关代码如下.如果我遗失了什么,请告诉我
views.py代码:
@app.route('/new/post', methods = ['GET', 'POST'])
@login_required
def new_post():
form = PostForm()
if form.validate_on_submit():
post = Post(title = form.title.data,
content = form.content.data,
hometest = form.hometest.data,
author = users.get_current_user())
post.put()
flash('Post saved on database.')
return redirect(url_for('list_posts'))
form.hometest.choices = [ (h.key.id(),h.homename)for h in Home.query()]
return render_template('new_post.html', form=form)
Run Code Online (Sandbox Code Playgroud)
myforms.py:
class PostForm(Form):
title = wtf.TextField('Title', validators=[validators.Required()])
content = wtf.TextAreaField('Content', validators=[validators.Required()])
hometest = wtf.SelectField(u'Home …Run Code Online (Sandbox Code Playgroud) 我想要一个可选的DateField,但如果将其保留为空,我会收到"Not a valid date value"错误
我在wtforms的源代码中添加了一些日志,发现formdata.getlist(self.name)为此DateField返回[u'']
我的表格代码:
from wtforms import BooleanField, TextField, TextAreaField, PasswordField, validators, HiddenField, DateField, SelectField
from flask_wtf import Form
class EmployeeForm(Form):
id = HiddenField('id')
title = TextField('Title')
start = DateField('Start Date', format='%m/%d/%Y')
Run Code Online (Sandbox Code Playgroud) 有什么区别DataRequired和InputRequired在wtforms.valiadators
我的注册表单中有一些字段:
username
password
password_repeat
submit
Run Code Online (Sandbox Code Playgroud)
这些字段应该使用DataRequired还是InputRequired验证器?
我有一个Flask应用程序,我可以通过上传CSV文件填充表单数据然后读取.我想用从CSV读取的数据填充FieldList.但是,当我尝试填充数据时,它会将原始HTML输入到TextFields中,而不仅仅是我想要的值.我究竟做错了什么?
app.py
from flask import Flask, render_template, request, url_for
from flask.ext.wtf import Form
from wtforms import StringField, FieldList, FormField, SelectField
from wtforms.validators import DataRequired
from werkzeug.datastructures import MultiDict
app = Flask(__name__)
app.config['SECRET_KEY']='asdfjlkghdsf'
# normally student data is read in from a file uploaded, but for this demo we use dummy data
student_info=[("123","Bob Jones"),("234","Peter Johnson"),("345","Carly Everett"),
("456","Josephine Edgewood"),("567","Pat White"),("678","Jesse Black")]
class FileUploadForm(Form):
pass
class StudentForm(Form):
student_id = StringField('Student ID', validators = [DataRequired()])
student_name = StringField('Student Name', validators = [DataRequired()])
class AddClassForm(Form): …Run Code Online (Sandbox Code Playgroud) 我的应用程序使用Flask,Flask-SQLAlchemy,Flask-WTF和Jinja2的组合.
在目前的版本中,我有一个设置表.该表只有一个记录,包含一个字段.最初该表包含零记录.
我想要实现的是:
这是我的代码:
models.py
class Provider(db.Model):
id = db.Column(db.Integer, primary_key = True)
rssfeed = db.Column(db.String(120), unique = True)
def __init__(self, rssfeed):
self.rssfeed = rssfeed
def __repr__(self):
return '<NZBMatrix feed url %r>' % self.rssfeed
Run Code Online (Sandbox Code Playgroud)
forms.py
class SettingsForm(Form):
rssfeed = TextField('rssfed', validators= [Required()])
Run Code Online (Sandbox Code Playgroud)
views.py
@app.route('/settings', methods=["GET","POST"])
def settings():
""" show settings """
provider = Provider.query.get(1)
form = SettingsForm(obj=provider)
print provider
if request.method == "POST" and form.validate():
if Provider.query.get(1) is None:
provider = Provider(rssfeed=form.rssfeed.data)
form.populate_obj(provider)
db.session.add(provider)
db.session.commit()
flash("Settings added") …Run Code Online (Sandbox Code Playgroud) 我对于flask框架相当新,并且正在为webportal创建一个编辑配置文件页面.我陷入困境,无法自动填写表格.
这是我的表单类:
class EditProfile(Form):
username = TextField('Username', [Required()])
email = TextField('Email', [Required()])
about = TextAreaField('About', [Required()])
website = TextField('Website', [Required()])
Run Code Online (Sandbox Code Playgroud)
这是我评估表单的函数.
def editprofile(nickname = None):
if g.fas_user['username'] == nickname or request.method == 'POST':
form = EditProfile()
form_action = url_for('profile.editprofile')
if request.method == 'POST' and form.validate():
if form.username.data == nickname :
query = EditProfile(form.username.data,
form.email.data,
form.about.data,
form.website.data,
)
print query #debug
db.session.add(query)
db.session.commit()
flash('User Updated')
print "added"
return(url_for('profile.editprofile'))
return render_template('profile/add.html', form=form,
form_action=form_action, title="Update Profile")
else:
return "Unauthorised"
Run Code Online (Sandbox Code Playgroud)
我的表单形式的html模板是:
{% extends "base.html" …Run Code Online (Sandbox Code Playgroud) 我SelectField在表单中有三个相同的输入,每个输入都有相同的选项集.我不能使用一个多选.
我想确保用户为这三个字段选择三种不同的选择.
在自定义验证中,您似乎一次只能引用一个字段,而不是将此字段的值与其他字段进行比较.我怎样才能做到这一点?谢谢!
我想使用代表这些模型的Flask,SQLAlchemy和WTForms为多对多关系创建一个表单:
personaddress = db.Table('personaddress',
db.Column('person', db.Integer, db.ForeignKey('person.id')),
db.Column('address', db.Integer, db.ForeignKey('address.id'))
)
class Person(db.Model):
__tablename__ = "person"
id = db.Column(Integer, primary_key=True)
name = db.Column(String, nullable=False)
addresses = db.relationship('Address', secondary=personaddress, backref=db.backref('person', lazy='dynamic'))
class Address(db.Model):
__tablename__ = "address"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False)
Run Code Online (Sandbox Code Playgroud)
要求
现在我想创建一个包含表单的单个页面来实现以下功能:
重要要求:使用QuerySelectField,我可以为一个人选择现有地址.但我想以相同的形式添加新地址.
我已经model_form使用了FormField用于连接表的主要模型和子表单,但我无法弄清楚如何更新包括外键关系在内的所有内容.该页面应该有一个提交按钮,用于显示所有表单和子表单.
问题
flask ×10
flask-wtforms ×10
python ×8
wtforms ×6
forms ×2
fieldlist ×1
sqlalchemy ×1
validation ×1