Как я могу поднять ValidationError (или сделать что-то подобное) в views.py моего Django?

Я использую 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. Например... был последний раз, когда пользователь опубликовал что-то более минуты назад?

Для такого типа вещей требуется request.user, который слой модели не может получить. Итак, я должен проверить в views.py. Как мне сделать что-то в view.py, чтобы сделать то же самое, что и это?

raise forms.ValidationError("Headline must be more than 5 characters.")

Ответ 1

Я думаю, что gruszczy ответ хороший, но если вы после общей проверки с участием переменных, которые, по вашему мнению, доступны только в представлении, вот альтернатива: передайте в vars в качестве аргументов формы и обработайте их в метод основной формы().

Разница/преимущество здесь в том, что ваш взгляд остается более простым, и все вещи, связанные с приемлемым содержанием формы, встречаются в форме.

например:

# 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)

Обратите внимание, что повышение общего ValidationError в методе clean() приведет к ошибке в myform.non_field_errors, поэтому вам нужно убедиться, что ваш шаблон содержит {{form.non_field_errors}}, если вы вручную показываете свою форму

Ответ 2

Вы не используете ValidationError в представлениях, как те исключения, что и для форм. Скорее, вы должны перенаправить пользователя на другой URL-адрес, который объяснит ему, что он не сможет опубликовать его снова. Это правильный способ справиться с этим. ValidationError должен быть поднят внутри экземпляра Form, если входные данные не проверяются. Это не так.