2009-09-26 22 views

risposta

58

Il modo più semplice è fornire il set di errori predefiniti alla definizione del campo modulo. I campi del modulo possono prendere un argomento con nome per questo. Ad esempio:

my_default_errors = { 
    'required': 'This field is required', 
    'invalid': 'Enter a valid value' 
} 

class MyForm(forms.Form): 
    some_field = forms.CharField(error_messages=my_default_errors) 
    .... 

Spero che questo aiuti.

+0

Sì. Ma voglio sovrascrivere il default con la flessibilità di impostare un modulo specifico ... Nel tuo caso dovrò unire default e form messaggi di errore messaggio manualmente ogni volta – Brock

+0

@Brock Che non è così male. Puoi semplicemente scrivere 'my_default_errors.update ({...})' per lasciare un campo o formare valori specifici. –

3

Si consiglia di guardare l'eccellente i18n support di Django.

3

Hmm, sembra che non ci sia soluzione facile per il problema.

Wile sfogliando il codice Django, ho trovato che i messaggi di errore di default sono hard-coded in ogni classe campo di modulo, per esempio:

class CharField(Field): 
    default_error_messages = { 
     'max_length': _(u'Ensure this value has at most %(max)d characters (it has %(length)d).'), 
     'min_length': _(u'Ensure this value has at least %(min)d characters (it has %(length)d).'), 
    } 

E il modo più semplice è quello di utilizzare l'argomento error_messages, così ho dovuto scrivere la funzione wrapper:

def DZForm(name, args = {}): 
    error_messages = { 
     'required': u'required', 
     'invalid': u'invalid', 
    } 
    if 'error_messages' in args.keys(): 
     args['error_messages'] = error_messages.update(args['error_messages']) 
    else: 
     args['error_messages'] = error_messages 
    return getattr(forms, name)(**args) 

Se SMDB sa modo più elegent di fare questo sarebbe davvero appreaciate di vederlo :)

Grazie!

-5

Poiché questa pagina viene visualizzata in una ricerca, forse vale la pena aggiungere il mio $ 0,02 anche se la domanda è vecchia. (Mi sto ancora abituando alla particolare etichetta di Stack Overflow.)

Il trattino di sottolineatura ("_") è un alias (se è il termine giusto) per ugettext_lazy; basta guardare le istruzioni di importazione nella parte superiore del file con messaggi "hardcoded". Quindi, i documenti di internazionalizzazione di Django dovrebbero aiutare, ad es. http://www.djangobook.com/en/2.0/chapter19/

6

Inoltre, vieni da Google e ciò di cui ho bisogno è sovrascrivere i messaggi predefiniti richiesti per tutti i campi nel mio modulo piuttosto che passare l'argomento error_messages ogni volta che ho definito nuovi campi modulo. Inoltre, non sono ancora pronto per approfondire i18n, questa app non è richiesta per essere multilingue. Il commento in questo post del blog è il più vicino a quello che voglio: -

http://davedash.com/2008/11/28/custom-error-messages-for-django-forms/

Per tutti i campi del modulo che ha richiesto i messaggi, questo è quello che ho fatto: -

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for k, field in self.fields.items(): 
      if 'required' in field.error_messages: 
       field.error_messages['required'] = 'You have to field this.' 

class MUserForm(MyForm): 
    user = forms.CharField(
     label="Username", 
    ) 
    .... 
1

Dire che ho un BaseForm con qualche error_messages dizionario come:

error_messages = { 
    'required': 'This field is required', 
    'caps': 'This field if case sensitive' 
} 

e voglio ignorare uno dei messaggi di errore:

class MySpecialForm(BaseForm): 
    def __init__(self, *args, **kwargs): 
     super(MySpecialForm, self).__init__(*args, **kwargs) 
     self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!' 

Fondamentalmente, basta sostituire uno dei valori del dizionario. Non sono sicuro di come funzionerebbe con l'internazionalizzazione.

3

da ProDjango libro:

from django.forms import fields, util 


class LatitudeField(fields.DecimalField): 
    default_error_messages = { 
     'out_of_range': u'Value must be within -90 and 90.', 
    } 


    def clean(self, value): 
     value = super(LatitudeField, self).clean(value) 
     if not -90 <= value <= 90: 
      raise util.ValidationError(self.error_messages['out_of_range']) 
     return value 
7

globalmente ignorare il messaggio di errore "necessaria", impostare l'attributo default_error_messages classe sul campo:

# form error message override 
from django.forms import Field 
from django.utils.translation import ugettext_lazy 
Field.default_error_messages = { 
    'required': ugettext_lazy("This field is mandatory."), 
} 

Questo deve accadere prima che i campi sono istanziati, per esempio includendolo in settings.py.

+0

Questa scimmia è valida per la patch e dovrebbe essere evitata in quanto la tua app è più dipendente dall'ordine di caricamento (tra molti altri motivi). –

Problemi correlati