Come posso sovrascrivere i messaggi di errore del modulo predefinito (ad esempio: bisogno di loro in altra lingua) per le tutte le applicazioni nel mio progetto (o almeno per 1 app)Django di override forma predefinita i messaggi di errore
Grazie!
Come posso sovrascrivere i messaggi di errore del modulo predefinito (ad esempio: bisogno di loro in altra lingua) per le tutte le applicazioni nel mio progetto (o almeno per 1 app)Django di override forma predefinita i messaggi di errore
Grazie!
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.
Si consiglia di guardare l'eccellente i18n support di Django.
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!
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/
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",
)
....
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.
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
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.
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). –
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
@Brock Che non è così male. Puoi semplicemente scrivere 'my_default_errors.update ({...})' per lasciare un campo o formare valori specifici. –