2009-09-26 17 views

Odpowiedz

58

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.

+0

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

+0

@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. –

3

Być może zechcesz spojrzeć na doskonałą wersję Django i18n support.

3

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!

-5

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/

6

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

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.

3

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 
7

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.

+0

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). –

Powiązane problemy