пользовательские сообщения об ошибках с формой модели - PullRequest
43 голосов
/ 09 августа 2010

Я вижу, как добавить сообщение об ошибке в поле при использовании форм, но как насчет формы модели?

Это моя тестовая модель

class Author(models.Model):
    first_name = models.CharField(max_length=125)
    last_name = models.CharField(max_length=125)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

Моя форма модели

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author

Сообщение об ошибке в полях: first_name и last_name: «Это поле обязательно для заполнения».Как мне изменить это в модельной форме?

Ответы [ 7 ]

46 голосов
/ 13 февраля 2014

Новое в Django 1.6 :

ModelForm принимает несколько новых мета-опций.

  • Поля, включенные в список localized_fields, будут локализованы (путем установки localize в поле формы).
  • Параметры label, help_texts и error_messages могут использоваться для настройки полей по умолчанию, см. Переопределение полей по умолчанию для получения подробной информации.

Из этого:

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        labels = {
            'name': _('Writer'),
        }
        help_texts = {
            'name': _('Some useful help text.'),
        }
        error_messages = {
            'name': {
                'max_length': _("This writer's name is too long."),
            },
        }

Связанный: ModelForm Джанго - где находится список мета-опций?

39 голосов
/ 09 августа 2010

Для простых случаев вы можете указать пользовательские сообщения об ошибках

class AuthorForm(forms.ModelForm):
    first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'})
    class Meta:
        model = Author
15 голосов
/ 27 марта 2013

Другой простой способ сделать это - просто переопределить его в init.

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author

    def __init__(self, *args, **kwargs):
        super(AuthorForm, self).__init__(*args, **kwargs)

        # add custom error messages
        self.fields['name'].error_messages = {'required': 'Please let us know what to call you!'}
15 голосов
/ 23 января 2012

Я тоже много раз задавался этим вопросом. Вот почему я наконец-то написал небольшое расширение для класса ModelForm, которое позволяет мне устанавливать произвольные атрибуты полей - включая сообщения об ошибках - через класс Meta. Код и объяснение можно найти здесь: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html

Вы сможете делать такие вещи:

class AuthorForm(ExtendedMetaModelForm):
    class Meta:
        model = Author
        field_args = {
            "first_name" : {
                "error_messages" : {
                    "required" : "Please let us know what to call you!"
                }
            }
        }

Я думаю, это то, что вы ищете, верно?

7 голосов
/ 09 августа 2010

Самый простой способ - переопределить чистый метод:

class AuthorForm(forms.ModelForm):
   class Meta:
      model = Author
   def clean(self):
      if self.cleaned_data.get('name')=="":
         raise forms.ValidationError('No name!')
      return self.cleaned_data
5 голосов
/ 17 февраля 2015

У меня есть более чистое решение, основанное на ответе jamesmfriedman. Это решение еще более СУХОЕ, особенно если у вас много полей.

custom_errors = {
    'required': 'Your custom error message'
}

class AuthorForm(forms.ModelForm):
    class Meta:
        model = Author

    def __init__(self, *args, **kwargs):
        super(AuthorForm, self).__init__(*args, **kwargs)

        for field in self.fields:
            self.fields[field].error_messages = custom_errors
2 голосов
/ 31 мая 2017

Вы можете легко проверить и поставить собственное сообщение об ошибке, переопределив метод clean() и используя self.add_error(field, message):

def clean(self):
    super(PromotionForm, self).clean()
    error_message = ''
    field = ''
    # reusable check
    if self.cleaned_data['reusable'] == 0:
        error_message = 'reusable should not be zero'
        field = 'reusable'
        self.add_error(field, error_message)
        raise ValidationError(error_message)

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