【问题标题】:How to route form errors to another view using Flask, FlaskWTF如何使用 Flask、FlaskWTF 将表单错误路由到另一个视图
【发布时间】:2013-09-17 16:30:36
【问题描述】:

我正在尝试使用 Flask 创建两个视图。第一个视图show_entries 显示表中的条目列表。它还包括一个用于创建新条目的表单。

表单被提交到第二个视图new_entry,它接受 POST 方法并负责使用 SQLAlchemy 将新条目添加到表中。 new_entry 然后重定向回show_entries

我的问题是 form.errors 没有路由到show_entries,所以用户永远看不到它们。我不确定解决此问题的最佳方法,或者我什至在我划分观点的方式上是否走在正确的轨道上。

这是我目前拥有的:

def show_entries():
    entryForm = EntryForm()
    entries = g.user.entries
    return render_template('show_entries.html', 
                           entries=entries,
                           entryForm=entryForm)

def new_entry():
    form = EntryForm()
    if form.validate_on_submit():
        newEntry = Entry(g.user, form.time.data)
        db_session.add(newEntry)
        db_session.commit()
        flash('New entry was succesfully posted')
    return redirect(url_for('show_entries'))

【问题讨论】:

    标签: python forms sqlalchemy flask flask-wtforms


    【解决方案1】:

    通常的模式是将 /show_entries 作为列表页面,并以 new_entry 作为表单。当您向 new_entry 发出 GET 请求时,您将获得表单,然后向其 POST 以添加条目。这样,如果出现错误,您可以将其显示在表单旁边 - 所有数据都可用。如果您按原样拆分视图,则需要某种方式将错误数据(和表单数据)从 new_entry 视图移动到 show_entries 视图。

    类似的东西(未经测试):

    def show_entries():
        entries = g.user.entries
        return render_template('show_entries.html', 
                               entries=entries)
    
    def new_entry():
        form = EntryForm()
        if form.validate_on_submit():
            newEntry = Entry(g.user, form.time.data)
            db_session.add(newEntry)
            db_session.commit()
            flash('New entry was successfully posted')
            return redirect(url_for('show_entries'))
        return render_template('show_new_entry_form.html', 
                               entryForm=form)
    

    【讨论】:

    • 谢谢,艾丹。但是如果我想在 show_entries 页面中包含一个表单,这样用户就可以快速添加一个新条目而无需加载另一个页面,这通常是如何处理的?
    • 您最好在 show_entries 视图中完成所有操作,而根本没有 new_entry 。或者,您可以使用 javascript - 如果您愿意,js 可以向另一个视图发出请求。这样做的问题是您必须编写自定义 js 来显示从视图返回的错误,或者让视图仅返回要重新显示的 html 片段。这实际上取决于您的用例。需要支持无js浏览器吗?
    • 我认为最终将需要 javascript 来实现我的想法。但它现在超出了我的范围(我只是想掌握 Python)。所以与此同时,我选择了一个中间立场:如果用户在show_entries 表单中正确输入数据,则该条目将由new_entry 添加,用户将被路由回show_entries。如果出现验证错误,new_entry 将呈现 show_new_entry_form.html 并且用户将看到错误。
    • 对我来说听起来是一个合理的妥协。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2019-09-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多