Как использовать error_messages на моделях в Django - PullRequest
5 голосов
/ 25 января 2011

Из документации http://docs.djangoproject.com/en/dev/ref/models/fields/ я понимаю, что вы можете добавить error_messages в поле модели и указать свой собственный набор сообщений об ошибках. Тем не менее, что они являются ключами к диктату, который вы должны передать?

class MyModel(models.Model):
   some_field = models.CharField(max_length=55, error_messages={'required': "My custom error"})

Если это проще сделать на используемой модели, это также сработает. Я бы предпочел не создавать явно создавая каждое поле и их тип снова. Вот чего я пытался избежать:

class MyModelForm(forms.ModelForm):
    some_field = forms.CharField(error_messages={'required' : 'Required error'})

Обновление 2: Тестовый код, используемый в моем проекте

Моя модель:

class MyTestModel(models.Model):
    name = models.CharField(max_length=127,error_messages={'blank' : 'BLANK','required' : 'REQUIRED'})

Моя форма:

class EditTestModel(ModelForm):
    class Meta:
        model = MyTestModel

My View:

tf = EditTestModel({'name' : ''})

print tf.is_valid() # prints False
print tf.full_clean() # prints None
print tf # prints the form, with a <li> error list containg the error "This field is required"


<tr><th><label for="id_name">Name:</label></th><td><ul class="errorlist"><li>This field is required.</li></ul><input id="id_name" type="text" name="name" maxlength="127" /></td></tr>

Ответы [ 3 ]

5 голосов
/ 25 января 2011

Вы правы, эти документы не очень полезны.В конце концов, это недавнее добавление!

Я предполагаю, что обычное использование error_messages - для ModelForms, поэтому я бы посмотрел здесь список допустимых ключей ошибок для каждого поля: http://docs.djangoproject.com/en/dev/ref/forms/fields/#error-messages

Но, если вы хотите быть действительно в безопасности и ничего не предполагать ...

На данный момент самым надежным способом будет поиск источника django/db/models/fields/__init__.py, где вы 'Вы увидите каждый из default_error_messages, который можно указать, и фактические вызовы self.error_messages['invalid']

# Field (base class)

default_error_messages = {
    'invalid_choice': _(u'Value %r is not a valid choice.'),
    'null': _(u'This field cannot be null.'),
    'blank': _(u'This field cannot be blank.'),
}

# AutoField  
    default_error_messages = {
        'invalid': _(u'This value must be an integer.'),
    }

Вот документация по проверке модели: http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects

Обновление:

Только что проверил это в сеансе оболочки, и похоже, что оно работает.Что случилось?

Я только что определил простую модель:

class SubscriptionGroup(models.Model):
    name = models.CharField(max_length=255, error_messages={'blank': 'INVALID!!11', 'null': 'NULL11!'})

# shell
>>> s = SubscriptionGroup()
>>> s.full_clean()
ValidationError: {'name': [u'INVALID!!11']}
3 голосов
/ 28 августа 2012

(Немного опоздал, но я сам сталкивался с теми же проблемами, поэтому использую это как note_to_self как угодно.)

Вы можете указать error_messages как для моделей, так и для моделей.Ключи, которые вы должны / можете использовать, определены здесь для полей формы.Кажется, проблема заключается в (мне) взаимосвязи между формами и связанной моделью, а также о том, какое сообщение об ошибке появляется и когда.Ключом к этому является понимание того, что формы и модели на самом деле очень слабо связаны, и что на самом деле волшебства не происходит.

Если у вас есть поле модели с именем 'quote', max_length 140 и форма модели, связанная с этой моделью, сообщения об ошибках будут работать следующим образом:

  • Если вы не't явно добавляет атрибут max_length в форму модели, а затем проверяет форму (вызывая is_valid() или errors), возвращаемое сообщение об ошибке будет от модели.
  • Если вы добавите набор error_messages ('required', 'max_length') в модель, они появятся в коллекции ошибок.
  • Если вы добавите набор error_messages к форме модели, они не будут отображаться, так как это модель, которая не проходит проверку, а не форму.
  • Если затем добавить атрибут max_length вв модели, вы увидите, как ошибки формы модели всплывают (и переопределяют модель error_messages.)

Итак, довольно просто - в общем, сообщения об ошибках отображаются на проверяемый объект, который может бытьмодель или модель формы.

2 голосов
/ 18 июля 2012

Я пытался. Это не будет работать, если вы определили это в моделях. Вы должны определить error_messages в ваших формах, как это

name = forms.CharField(error_messages={'required': 'this field is required'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...