3

Flask + Flask-Classy + WTForms を使用して、ルートを実装しようとしています。ユーザーが入力フォームにエラーがある場合、アプリケーションはそのフォームをユーザーに再度表示し、ユーザーが既に入力したものを完成させます。このようにして、ユーザーはすべてのフォーム入力をもう一度入力することを心配する必要はありませんでした: (s)彼はエラーを修正することができます.

これらは、フラスコクラスのクラスである私のクラス UserView(FlaskView) のコードです。

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ます。

なにか提案を?それとも、この問題を間違った方向に解決しようとしているのですか?

EDIT 1:エラーを表示する方法について詳しく説明します

@Rawrgulmuffins がエラーをインラインで表示する方法に関する回答を追加したため (ページがジャンプしないため、これが最善の方法だと思います)、ここで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 %}

与えられたスクリーンショット:

検証エラー表示

4

2 に答える 2

2

テンプレートをレンダリングしてエラーを表示できる理由を理解していない人のために、swdevの回答を拡張するために私の回答を追加しています。

フォームの各フィールドには、検証後に入力されるエラー属性が含まれています (後form.validate())。これらのエラーは、フォーム オブジェクトに含まれます。したがって、次のように言うことができます。

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

サンプル ソース ファイル. あなたはただ言うことができるので、これは非常に気の利いたものです

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

最初のレンダリングの場合は、エラーのないフォームを取得し、フォームの 2 回目のレンダリングでのみエラーを表示します。

Swdev がフォームをリダイレクトしようとしたために、現在操作されている理由がわかりません。答えが見つかるかどうかを確認するために、現在 Werkzeug コードを調べています。

于 2013-10-03T17:46:01.083 に答える
1

ああ、私はなんて愚かなんだ。しばらく休んだ直後に、別のビューメソッドに渡す代わりに、簡単な答えを見つけました。

else:                                                                                                                                                                                                                     
   return redirect(url_for('UserView:validation_error', error_form=form))

テンプレートを簡単にレンダリングできます:

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

それは簡単です;)

于 2013-10-03T08:54:43.347 に答える