标签: flask-wtforms

使用flask和WTForms在单个页面中使用多个表单

我在同一页面上有多个表单,将发送请求发送到烧瓶中的同一个处理程序.

我正在使用wtforms生成表单.

确定提交哪种表单的最佳方法是什么?

我目前正在使用action="?form=oneform".我认为应该有一些更好的方法来实现同样的目标?

forms flask flask-wtforms

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

由于缺少CSRF,表单验证失败

几天前,我已经重置了我的本地烧瓶环境,而没有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)

我第一次发送一个Getform.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)

python forms flask flask-wtforms

22
推荐指数
3
解决办法
3万
查看次数

当我使用Flask的POST时,我遇到了wtforms selectfields的问题

我对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)

python flask wtforms flask-wtforms

21
推荐指数
2
解决办法
2万
查看次数

如何使用Flask-WTF实现不需要的DateField

我想要一个可选的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)

flask wtforms flask-wtforms

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

Flask WTForms:DataRequired和InputRequired之间的区别

有什么区别DataRequiredInputRequiredwtforms.valiadators

我的注册表单中有一些字段:

username
password 
password_repeat 
submit
Run Code Online (Sandbox Code Playgroud)

这些字段应该使用DataRequired还是InputRequired验证器?

python flask wtforms flask-wtforms

19
推荐指数
1
解决办法
6595
查看次数

填充WTForms FormField FieldList,数据结果以字段形式显示HTML

我有一个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)

python fieldlist flask wtforms flask-wtforms

19
推荐指数
2
解决办法
8071
查看次数

Flask-SQLAlchemy:如何有条件地插入或更新行

我的应用程序使用Flask,Flask-SQLAlchemy,Flask-WTF和Jinja2的组合.

在目前的版本中,我有一个设置表.该表只有一个记录,包含一个字段.最初该表包含零记录.

我想要实现的是:

  • 假设db中没有条目,则显示准备用户输入的空表单
  • 鉴于存在条目,显示条目,和
  • 如果用户更改了值,则更新db中的rec.

这是我的代码:

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)

python flask wtforms flask-sqlalchemy flask-wtforms

18
推荐指数
2
解决办法
3万
查看次数

使用SQLAlchemy对象中的数据预填充烧瓶中的WTforms

我对于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)

python flask flask-sqlalchemy flask-wtforms

18
推荐指数
3
解决办法
2万
查看次数

如何相互验证wtforms字段?

SelectField在表单中有三个相同的输入,每个输入都有相同的选项集.我不能使用一个多选.

我想确保用户为这三个字段选择三种不同的选择.

在自定义验证中,您似乎一次只能引用一个字段,而不是将此字段的值与其他字段进行比较.我怎样才能做到这一点?谢谢!

python validation flask wtforms flask-wtforms

17
推荐指数
2
解决办法
8055
查看次数

使用Flask,SQLAlchemy和WTForms更新多对多关系?

我想使用代表这些模型的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用于连接表的主要模型和子表单,但我无法弄清楚如何更新包括外键关系在内的所有内容.该页面应该有一个提交按钮,用于显示所有表单和子表单.

问题

  1. 如何在Flask中实现上述要求?
  2. 这是多对多场景,Django可以通过其管理界面更轻松地处理这些场景吗?

python sqlalchemy flask flask-wtforms

16
推荐指数
1
解决办法
3777
查看次数