Djangoフォームを使用しています。モデルレイヤーで検証しています:
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Headline must be more than 5 characters.")
return title
ただし、views.py
で検証する必要があることがいくつかあります。たとえば...ユーザーが1分以上前に何かを投稿したのは最後でしたか?
そのようなものにはrequest.userが必要ですが、モデルレイヤーはこれを取得できません。したがって、views.pyで検証する必要があります。 views.pyで何かを実行して、これとまったく同じことを行うにはどうすればよいですか?
raise forms.ValidationError("Headline must be more than 5 characters.")
Gruszczyの答えは良いものだと思いますが、ビューでのみ使用できると思われる変数を含む一般的な検証を行っている場合は、別の方法があります。変数を引数としてフォームに渡し、フォームのメインで処理します。 clean()メソッド。
ここでの違い/利点は、ビューがシンプルなままであり、受け入れ可能なフォームコンテンツに関連するすべてのことがフォームで発生することです。
例えば:
_# IN YOUR VIEW
# pass request.user as a keyword argument to the form
myform = MyForm(user=request.user)
# IN YOUR forms.py
# at the top:
from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting
# and in your particular Form definition
class MyForm(forms.Form)
... your fields here ...
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user') # cache the user object you pass in
super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form
def clean(self):
# test the rate limit by passing in the cached user object
if not ok_to_post(self.user): # use your throttling utility here
raise forms.ValidationError("You cannot post more than once every x minutes")
return self.cleaned_data # never forget this! ;o)
_
clean()
メソッドで汎用ValidationError
を発生させると、エラーが_myform.non_field_errors
_に入れられるため、テンプレートに_{{form.non_field_errors}}
_が含まれていることを確認する必要があります。 'フォームを手動で表示しています
フォームの場合と同様に、ビューではValidationError
を使用しません。むしろ、ユーザーを他のURLにリダイレクトする必要があります。これにより、ユーザーはすぐに再投稿できないことを説明できます。これは、このようなものを処理するための適切な方法です。入力データが検証されない場合は、ValidationError
をForm
インスタンス内で発生させる必要があります。これはそうではありません。
ビューでメッセージを使用できます。
from Django.contrib import messages
messages.error(request, "Error!")
ドキュメント: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/