2010-08-09 13 views
35

È possibile visualizzare come aggiungere un messaggio di errore a un campo quando si utilizzano i moduli, ma per quanto riguarda il modulo del modello?messaggi di errore personalizzati con Modello Modulo

Questo è il mio modello di prova

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) 

La mia forma modello

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

Il messaggio di errore sui campi: first_name, cognome ed è "Questo campo è obbligatorio". Come posso cambiarlo in un modello?

risposta

29

Per i casi semplici, è possibile 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

fresco grazie. Non sapevo quale sarebbe stato il risultato di ciò. La documentazione dice "I campi dichiarati sostituiranno quelli predefiniti generati usando l'attributo model" quindi dovrei essere buono.Dovrei anche reimpostare il max_field nel campo del modulo del modello. – iJK

+15

È davvero necessario ripetere le dichiarazioni di campo nel modulo? Che ne dici del principio DRY di cui django è fiero? – paweloque

+0

Questo non funziona: https://code.djangoproject.com/ticket/13693 – fjsj

7

il modo easyest è quello di sovrascrivere il metodo pulito:

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

mi sono domandato circa questo molte volte pure. Ecco perché alla fine ho scritto una piccola estensione alla classe ModelForm, che mi permette di impostare attributi di campo arbitrari - inclusi i messaggi di errore - tramite la classe Meta. Il codice e la spiegazione può essere trovato qui: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html

Sarete in grado di fare cose come questa:

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

penso che è quello che stai cercando, giusto?

+0

Questo è un ottimo modo per farlo. Sicuramente più DRY che ridefinire i campi del modulo. – suda

+0

@suda non stai veramente ridefinendo, stai ignorando il comportamento predefinito in base al modello associato. simile a cambiare un input in una textarea, stai ignorando il valore predefinito. – Chris

14

Un altro modo semplice per farlo è sovrascriverlo in 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

Funziona, sicuramente avrebbe accettato come risposta – Zac

+1

Questa è una soluzione molto migliore di tutte le altre in questo thread perché 1) Non è necessario utilizzare alcuna estensione 2) non è necessario riscrivere l'intera definizione del campo modulo perché dipende sulla definizione del campo del modello. +1 –

+2

Una nota pensava, devi usarlo come questo 'self.fields ['name']. Error_messages ['required'] = 'Per favore facci sapere come chiamarti!' O usare' .update() 'metodo, altrimenti si ripristinano tutti gli altri messaggi di errore. –

35

New in Django 1.6:

ModelForm accetta diverse nuove opzioni Meta.

  • I campi inclusi nell'elenco localized_fields saranno localizzati (impostando localize nel campo modulo).
  • Le opzioni etichette, help_texts e error_messages possono essere utilizzate per personalizzare i campi predefiniti, vedere Overriding the default fields per i dettagli.

Da che:

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

correlati: Django's ModelForm - where is the list of Meta options?

+0

Non capisco il _() che circonda il testo del messaggio di errore personalizzato, quindi l'ho eliminato. ma questo è il primo frammento che ha funzionato per me. sono su django 1.6. grazie Signore! –

+2

Prego! Se sei curioso, la funzione di sottolineatura è una scorciatoia comune per una utility di internazionalizzazione: http://stackoverflow.com/questions/2964244/django-meaning-of-leading-underscore-in-list-of-tuples-used- da definire-scelta-fi – doctaphred

4

ho una soluzione più pulita, in base alla risposta del jamesmfriedman. Questa soluzione è ancora più SECCA, specialmente se hai molti campi.

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

Si può facilmente verificare e mettere messaggio di errore personalizzato mediante l'override clean() metodo e utilizzando 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 
Problemi correlati