2011-03-21 2 views
12

Je sais comment définir mes propres messages d'erreur personnalisés lors de l'utilisation de formulaires Django ordinaires. Mais qu'en est-il de Django Form basé sur un modèle existant? Considérez modèle suivant et forme:Django, Models & Forms: remplacer le message "Ce champ est obligatoire"

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

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

Si je crée la forme et essayer de l'afficher, le message « Ce champ est obligatoire » apparaît. Mais comment le changer? Bien sûr que je pouvais faire quelque chose comme ceci:

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

Mais selon la documentation, attribut max_length ne sera pas préservé et je dois l'écrire explicitement à la définition du formulaire. Je pensais que le but de Model Forms est d'éviter d'écrire deux fois le même code. Il doit donc y avoir un moyen simple de modifier le message d'erreur personnalisé sans réécrire le formulaire entier. Fondamentalement, cela me suffirait si mon message ressemblait à quelque chose comme "Le nom du champ" est requis ".

Aidez-nous s'il vous plaît.

Répondre

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

Merci, ça a l'air bien. Cependant j'ai eu l'impression que vous avez évité d'écrire deux fois le même code mais en écrivant un autre code qui est en fait plus long et plus laid;) Néanmoins, il épargnera du travail au moins sur les grandes formes, merci encore. – tobik

+0

Je suppose à chacun son propre. Si vous avez besoin de remplacer tous les messages 'required', c'est de loin le plus propre. Je ne pense pas non plus que ce soit plus long, sauf si vous comptez l'appel __init__, que j'utilise généralement dans tout. –

+2

Notez que vous obtiendrez [un mystérieux 'KeyError'] (http://stackoverflow.com/questions/7463159/django-form-is-valid-keeps-threading-keyerror) si vous obtenez une erreur' invalid' et ne Ne fournissez pas un message pour cela. –

0

Vous pouvez modifier les attributs de champ lors de l'exécution, dans la méthode __init__.

Questions connexes