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

Объект JavaScript / словарь должен передаваться как список пар ключ-значение для ASP.NET MVC-контроллера, когда ожидается Dictionary<TKey, TValue>. Пример:

Если у вас есть такой словарь:

public Dictionary<string, decimal?> SomeMapping { get; set; }

, вы должны использовать что-то вроде этого в своем JavaScript:

var sourceMapping = { a: 1, b: 1.5, c: null };
var SomeMapping = [];
for (var key in sourceMapping) {
    if (sourceMapping.hasOwnProperty(key)) {
        SomeMapping.push({ Key: key, Value: sourceMapping[key] });
    }
}

I Этот метод использовался в асинхронном запросе POST (отправленном с использованием jQuery), который имел тип контента, установленный на 'application/json' (это может быть или не быть важным в вашем случае).

16
задан TIMEX 19 December 2010 в 09:56
поделиться

3 ответа

Я думаю, что ответ 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}}. ] если вы вручную отображаете свою форму

16
ответ дан Steve Jalim 19 December 2010 в 09:56
поделиться

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

from django.contrib import messages

messages.error(request, "Error!")

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

4
ответ дан ThomasAFink 19 December 2010 в 09:56
поделиться

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

6
ответ дан gruszczy 19 December 2010 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: