2010-08-09 4 views
35

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

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

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 является "Это поле обязательно". Как изменить это в модельной форме?

ответ

29

Для простых случаев, вы можете specify custom error messages

class AuthorForm(forms.ModelForm): 
    first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'}) 
    class Meta: 
     model = Author 
+1

Крутые спасибо. Я не знал, что было бы результатом этого. В документации говорится: «Объявленные поля будут переопределять значения по умолчанию, сгенерированные с помощью атрибута model», поэтому я должен быть хорошим.Я также должен был бы установить max_field снова в поле формы модели. – iJK

+15

Действительно ли необходимо повторять декларации полей в форме? Как насчет принципа DRY django? – paweloque

+0

Это не работает: https://code.djangoproject.com/ticket/13693 – fjsj

7

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

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 
15

Я задавался вопросом об этом много раз, а также. Вот почему я, наконец, написал небольшое расширение класса 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!" 
       } 
      } 
     } 

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

+0

Это отличный способ сделать это. Конечно, более DRY, чем переопределение полей формы. – suda

+0

@suda Вы действительно не переопределяете, вы переопределяете поведение по умолчанию, основанное на связанной модели. подобно изменению ввода в текстовое поле, вы переопределяете значение по умолчанию. – Chris

14

Другой простой способ сделать это просто переопределить его в 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!'} 
+0

Это работает, определенно было бы принято как ответ – Zac

+1

Это гораздо лучшее решение, чем все остальные в этом потоке, потому что 1) вам не нужно использовать какие-либо расширения 2) вам не нужно переписывать определение поля всей формы, потому что это зависит по определению модельного поля. +1 –

+2

В одной заметке вы должны использовать ее так: 'self.fields ['name']. Error_messages ['required'] = 'Пожалуйста, сообщите нам, что вам позвонить!' Или используя' .update() ', иначе вы сбросите все другие сообщения об ошибках. –

35

New in Django 1.6:

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

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

Из этого:

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."), 
      }, 
     } 

Похожие: Django's ModelForm - where is the list of Meta options?

+0

Я не понимаю _(), окружающего текст сообщения об ошибке, поэтому я принял это. но это первый фрагмент, который работал для меня. Я на django 1.6. Спасибо, сэр! –

+2

Добро пожаловать! Если вам интересно, функция подчеркивания является общим ярлыком для утилиты интернационализации: http://stackoverflow.com/questions/2964244/django-meaning-of-leading-underscore-in-list-of-tuples-used- определимого-выбор-Fi – doctaphred

4

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

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 
1

Вы можете легко проверить и поставить персонализированное сообщение об ошибке с помощью переопределения 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