python - 重新呈现包含错误的表格的技术是什么?

标签 python flask

使用 Flask + Flask-Classy + WTForms,我正在尝试实现一个路由,这样,当用户在输入表单时出现错误时,应用程序将再次向用户呈现该表单,并完成用户已经填写的内容。这样,用户不必担心再次输入所有表单输入:(s)他可以更正错误。

这些是我的类 UserView(FlaskView) 的代码,这是一个 flask-classy 类:

def post(self):                                                                                                                                                                                                               
    form = forms.UserForm(request.form)                                                                                                                                                                                       
    if form.validate():                                                                                                                                                                                                       
        if form.id.data=='':                                                                                                                                                                                                  
            user = models.Users()                                                                                                                                                                                             
            form.populate_obj(user)                                                                                                                                                                                           
            user.id = None                                                                                                                                                                                                    
            db.session.add(user)                                                                                                                                                                                              
        else:                                                                                                                                                                                                                 
            user = models.Users.query.get(form.id.data)                                                                                                                                                                       
            form.populate_obj(user)                                                                                                                                                                                           

        db.session.commit()                                                                                                                                                                                                   
        return redirect(url_for('UserView:index'))                                                                                                                                                                            
    else:                                                                                                                                                                                                                     
       return redirect(url_for('UserView:validation_error', error_form=form))                                                                                                                                                 

def validation_error(self, error_form):                                                                                                                                                                                       
    return render_template('users/form.html', form=error_form)       

您可以看到,在这次尝试中,我尝试创建另一个方法:validation_error,其参数——在我的期望中——应该包含所有表单数据。但是,我得到了 Jinja2 异常,UndefinedError: 'unicode object' has no attribute 'hidden_​​tag'。当我检查它时,在进入 validation_error 之后,form 对象从 UserForm 稍微改变为某种 unicode 对象。

有什么建议吗?还是我试图以错误的方向解决这个问题?

编辑 1:详细说明如何显示错误

@Rawrgulmuffins 添加了关于如何显示错误的答案 inline (我认为这是最好的方法,因为页面不会跳动),在这里我将代码粘贴到列出所有错误的 layout.html 中。它可能不如内联错误显示好,但我认为这是最简单的方法。首先我为表单对象做一个 if ,因为这段代码也存在于所有页面(我可能会进一步重构它)

 {% if form %}
                {% for error in form.errors %}
                <div class="alert alert-error">
                    <a class="close" data-dismiss="alert">×</a>
                    <strong>{{ form[error].label }} {{form.errors[error][0] }}</strong>
                </div>
 {% endfor %}
 {% endif %}

屏幕截图:

Validation error display

最佳答案

我添加了我的答案,以扩展 swdev 的答案,适用于任何不明白他为什么只能渲染模板并显示错误的人。

表单中的每个字段都包含一个错误属性,该属性将在验证后(在 form.validate() 之后)填充。这些错误将包含在表单对象中。所以你可以这样说,

{% if field.errors %}
    <span class="error help-inline">{{ field.errors|join(', ') }}</span>
{% endif %}

example source file .这非常漂亮,因为你可以说

 return render_template('users/form.html', form=form) 

如果是第一次呈现,则获得无错误表单,并仅在第二次呈现表单时显示错误。

我不确定为什么 Swdev 尝试重定向表单导致它现在被操纵。我现在正在查看 Werkzeug 代码,看是否能找到答案。

关于python - 重新呈现包含错误的表格的技术是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19152471/

相关文章:

Python PyQt 设置滚动区域

python - 有条件地为路由设置 FastAPI 响应模型

javascript - Flask 动态数据更新,无需重新加载页面

Python Flask CORS - API 始终允许任何来源

python - 最Pythonic的方式来中止缓存装饰器?

python flask before_request 排除/静态目录

python - Pandas 通过保留一列的第一个元素和另一列的最后一个元素来合并

python - 根据列中的值删除行中的值,然后在 Pandas 中将单元格拆分为多行

python - Pandas 中的递归定义

python - render_template() 恰好接受 1 个参数