2011-03-21 53 views
12

Sé cómo configurar mis propios mensajes de error personalizados cuando uso formularios ordinarios de Django. Pero, ¿qué pasa con Django Form basado en un modelo existente? apareceDjango, Modelos y Formularios: reemplace el mensaje "Este campo es obligatorio"

Class MyModel(models.Model): 
    name = models.CharField(max_length='30') 

Class MyForm(forms.ModelForm): 
    Class Meta: 
     model = MyModel 

Si creo la forma y tratar de publicar él, el mensaje "Este campo es obligatorio": Considere siguiente modelo y la forma. Pero, ¿cómo cambiarlo? Por supuesto que podría hacer algo como esto:

Class MyForm(forms.ModelForm): 
    model = forms.CharField(error_messages = {'required': "something..."}) 
    Class Meta: 
     model = MyModel 

Pero de acuerdo con la documentación, no será preservado atributo max_length y tengo que escribirlo de forma explícita a la definición del formulario. Pensé que el propósito de las Formas del Modelo es evitar escribir el mismo código dos veces. Entonces tiene que haber alguna manera fácil de cambiar el mensaje de error personalizado sin reescribir todo el formulario. Básicamente, sería suficiente para mí si mi mensaje tuviera el siguiente aspecto: "Se requiere el nombre del campo".

Por favor ayuda.

Respuesta

29
class MyForm(forms.ModelForm): 
    class Meta: 
      model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['name'].error_messages = {'required': 'custom required message'} 

     # if you want to do it to all of them 
     for field in self.fields.values(): 
      field.error_messages = {'required':'The field {fieldname} is required'.format(
       fieldname=field.label)} 
+0

Gracias, eso se ve bien. Sin embargo, tuve la impresión de que evitó escribir el mismo código dos veces pero escribiendo otro código que es más largo y feo;). Sin embargo, ahorrará trabajo al menos en formularios grandes, así que gracias de nuevo. – tobik

+0

Supongo que cada uno es suyo. Si necesita reemplazar todos los mensajes 'requeridos', este es el más limpio por el momento. Tampoco creo que sea más largo, a menos que cuentes la llamada __init__, que generalmente uso en todo. –

+2

Tenga en cuenta que obtendrá [un misterioso 'KeyError'] (http://stackoverflow.com/questions/7463159/django-form-is-valid-keeps-throwing-keyerror) si obtiene un error' invalid' y se pone No le proporcionamos un mensaje. –

0

puede cambiar los atributos del campo en tiempo de ejecución, en el método __init__.

Cuestiones relacionadas