Как вызвать ошибку ValidationError (или сделать что-то подобное) в views.py моего Django? - PullRequest
16 голосов
/ 19 декабря 2010

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

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

Ответы [ 3 ]

16 голосов
/ 19 декабря 2010

Я думаю, что ответ 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)

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

6 голосов
/ 19 декабря 2010

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

4 голосов
/ 14 января 2016

Вы можете использовать сообщения в представлениях:

from django.contrib import messages

messages.error(request, "Error!")

Документация: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...