Jak mogę nadpisać domyślne komunikaty o błędach postaci (na przykład: trzeba je w innym języku) dla wszystkich aplikacji w moim projekcie (lub przynajmniej przez 1 APP)Django komunikaty o błędach domyślna forma przesłanianie
Dzięki!
Jak mogę nadpisać domyślne komunikaty o błędach postaci (na przykład: trzeba je w innym języku) dla wszystkich aplikacji w moim projekcie (lub przynajmniej przez 1 APP)Django komunikaty o błędach domyślna forma przesłanianie
Dzięki!
Najprostszym sposobem jest podanie zestawu domyślnych błędów do definicji pola formularza. Pola formularza mogą przyjmować do niego nazwany argument. Na przykład:
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)
....
Mam nadzieję, że to pomoże.
Być może zechcesz spojrzeć na doskonałą wersję Django i18n support.
Hmm, wydaje się, że nie ma łatwego rozwiązania tego problemu.
Wile przeglądając kodu django, Znalazłem, że komunikaty o błędach domyślne są zakodowane w każdej klasie pola formularza, ex:
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).'),
}
A najprostszym sposobem jest użycie error_messages
argumentu, więc musiałem napisać funkcję otoki:
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)
Jeśli smdb wie więcej Elegent sposób robi to naprawdę appreaciate aby go :)
zobaczyć Dzięki!
Ponieważ ta strona pojawia się w wynikach wyszukiwania, być może warto dodać moje 0,02 USD, mimo że pytanie jest stare. (Wciąż przyzwyczajam się do specjalnej etykiety Stack Overflow).
Podkreślenie ("_") to alias (jeśli jest to właściwy termin) dla ugettext_lazy; wystarczy spojrzeć na instrukcje importu na górze pliku z "zakodowanymi" wiadomościami. Następnie dokumenty Django dotyczące internacjonalizacji powinny pomóc, np. http://www.djangobook.com/en/2.0/chapter19/
Również tutaj, z google i potrzebuję zastąpić domyślne wymagane komunikaty dla wszystkich pól w moim formularzu zamiast przekazywania argumentu error_messages za każdym razem, gdy definiowałem nowe pola formularza. Ponadto, nie jestem jeszcze gotowy, aby zagłębić się w i18n, aplikacje te nie muszą być wielojęzyczne. Komentarz w tym blogu jest najbliżej, co chcę: -
http://davedash.com/2008/11/28/custom-error-messages-for-django-forms/
Dla wszystkich pól formularza, który wymaganych wiadomości, to co robiłam: -
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",
)
....
Say mam BaseForm
niektóre error_messages
słownika jak:
error_messages = {
'required': 'This field is required',
'caps': 'This field if case sensitive'
}
i chcę, aby zastąpić jeden z komunikatów o błędach:
class MySpecialForm(BaseForm):
def __init__(self, *args, **kwargs):
super(MySpecialForm, self).__init__(*args, **kwargs)
self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!'
Zasadniczo wystarczy przesłonić jedną z wartości słownika. Nie jestem pewien, jak by to działało w przypadku internacjonalizacji.
z ProDjango książki:
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
Aby globalnie przesłonić "wymagane" komunikat o błędzie, należy ustawić atrybut class default_error_messages na polu:
# 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."),
}
To musi się zdarzyć, zanim jakiekolwiek pola są wystąpienia, na przykład poprzez uwzględnienie go w pliku settings.py.
Ta małpa łata ją i należy jej unikać, ponieważ wtedy twoja aplikacja jest bardziej zależna od kolejności ładowania (z wielu innych powodów). –
Tak. Ale chcę zastąpić domyślne z elastycznością, aby ustawić konkretny formularz ... W twoim przypadku będę musiał połączyć domyślny komunikat o błędzie formularza i dyktuje ręcznie za każdym razem – Brock
@Brock To nie jest takie złe. Możesz po prostu napisać 'my_default_errors.update ({...})', aby upuścić pole lub utworzyć określone wartości. –