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 %}
与えられたスクリーンショット: