Skip to main content
 首页 » 编程设计

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

2025年05月04日6mate10pro

使用 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 %} 

屏幕截图:

请您参考如下方法:

我添加了我的答案,以扩展 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 代码,看是否能找到答案。