2009-09-26 28 views

Respuesta

58

La manera más fácil es proporcionar su conjunto de errores predeterminados a la definición del campo de formulario. Los campos de formulario pueden tomar un argumento con nombre para ello. Por ejemplo:

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

Espero que esto ayude.

+0

Sí. Pero quiero anular el valor predeterminado con la flexibilidad para establecer un formato específico ... En su caso, tendré que fusionar el valor predeterminado y formar los mensajes de error dictados manualmente cada vez – Brock

+0

@Brock Eso no es tan malo. Simplemente puede escribir 'my_default_errors.update ({...})' para colocar en el campo o formar valores específicos. –

3

Es posible que desee ver la excelente i18n support de Django.

3

Hmm, parece que no hay una solución fácil para el problema.

Wile hojear el código de Django, he encontrado que los mensajes de error por defecto son en forma fija en cada clase de campo de formulario, por ejemplo:

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

Y la forma más sencilla es utilizar el argumento error_messages, así que tuve que escribir la función de contenedor:

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) 

Si SMDB sabe elegentPackage forma más de hacer esto sería realmente appreaciate a verlo :)

¡Gracias!

-5

Dado que esta página aparece en una búsqueda, quizás valga la pena agregar mis $ 0.02 aunque la pregunta sea antigua. (Todavía me estoy acostumbrando a la etiqueta particular de Stack Overflow.)

El guión bajo ("_") es un alias (si ese es el término correcto) para ugettext_lazy; solo mire las declaraciones de importación en la parte superior del archivo con mensajes "codificados". Entonces, los documentos de internacionalización de Django deberían ayudar, p. http://www.djangobook.com/en/2.0/chapter19/

6

También vengo desde google y lo que necesito es sobrescribir los mensajes requeridos por defecto para todos los campos en mi formulario en lugar de pasar el argumento error_messages cada vez que definí nuevos campos de formulario. Además, todavía no estoy listo para profundizar en i18n, estas aplicaciones no requieren ser multilingües. El comentario en esta entrada del blog es el más cercano a lo que yo quiero: -

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

Para todos los campos del formulario que se requieren mensajes, esto es lo que hice: -

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

Decir que tengo un BaseForm con un poco de error_messages diccionario como:

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

y quiero anular uno de los mensajes de error:

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

Básicamente, simplemente anule uno de los valores del diccionario. Aunque no estoy seguro de cómo funcionaría con la internacionalización.

3

del libro ProDjango:

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 anular el mensaje de error "requerido", establezca el atributo de clase default_error_messages de 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."), 
} 

Esto tiene que suceder antes se crean instancias de cualquiera de los campos, p.ej incluyéndolo en settings.py.

+0

Este mono simplemente lo parchea y debe evitarse ya que su aplicación depende más del orden de carga (entre muchas otras razones). –

Cuestiones relacionadas