web-dev-qa-db-ja.com

Djangoのviews.pyでValidationErrorを発生させる(または同様のことを行う)にはどうすればよいですか?

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.")
17
TIMEX

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}}_が含まれていることを確認する必要があります。 'フォームを手動で表示しています

19
Steve Jalim

フォームの場合と同様に、ビューではValidationErrorを使用しません。むしろ、ユーザーを他のURLにリダイレクトする必要があります。これにより、ユーザーはすぐに再投稿できないことを説明できます。これは、このようなものを処理するための適切な方法です。入力データが検証されない場合は、ValidationErrorFormインスタンス内で発生させる必要があります。これはそうではありません。

6
gruszczy

ビューでメッセージを使用できます。

from Django.contrib import messages

messages.error(request, "Error!")

ドキュメント: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/

5
ThomasAFink