49 votes

Comment accéder aux données lorsque form.is_valid () est false

Quand j'ai un formulaire Django valide, je peux accéder aux données avec form.cleaned_data. Mais comment puis-je obtenir les données saisies par un utilisateur lorsque le formulaire n'est pas valide, c'est-à-dire que formulaire.is_valid est false.

J'essaie d'accéder à des formulaires dans un ensemble de formulaires, alors formulaire.data semble me semer le chaos.

45voto

Dmitry Risenberg Points 1014

Vous pouvez utiliser

 form.data['field_name']
 

De cette façon, vous obtenez la valeur brute attribuée au champ.

17voto

S.Lott Points 207588

Voir http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

Deuxièmement, une fois que nous avons décidé que la combinaison des données dans les deux champs, nous envisagez ne sont pas valides, nous devons n'oubliez pas de les retirer de la cleaned_data.

En fait, Django actuellement anéantir complètement la cleaned_data dictionnaire si il y a des erreurs dans le formulaire. Cependant, ce comportement peut changer dans le futur, il n'est donc pas un mauvaise idée de nettoyer après vous en la première place.

Les données d'origine est toujours disponible en request.POST.


Un Commentaire suggère que le point de faire quelque chose qui ressemble plus sophistiqué de validation au niveau des champs.

Chaque champ est donné la non validées de données, et renvoie les données valides ou lève une exception.

Dans chaque domaine, tout type de validation peut être effectuée sur le contenu d'origine.

13voto

Sam Points 111

Je me débattais avec un problème similaire et je suis tombé sur une excellente discussion ici: https://code.djangoproject.com/ticket/10427

Ce n'est pas du tout bien documenté, mais pour un formulaire actif, vous pouvez afficher la valeur d'un champ - telle que vue par les widgets / utilisateurs - avec les éléments suivants:

 form_name['field_name'].value()
 

5voto

guettli Points 3284

Vous pouvez utiliser ce modèle:

 class MyForm(forms.Form):
    ...
    def clean(self):
        self.saved_data=self.cleaned_data
        return self.cleaned_data
 

Dans votre code:

 if form.is_valid():
    form.save()
    return django.http.HttpResponseRedirect(...)
if form.is_bound:
    form.saved_data['....'] # cleaned_data does not exist any more, but saved_data does.
 

Utiliser form.data n'est pas une bonne solution. Les raisons:

  • Si le formulaire a un préfixe, les clés du dictionnaire seront préfixées avec ce préfixe.
  • Les données dans form.data ne sont pas nettoyées: il n'y a que des valeurs de chaîne.

4voto

Dashdrum Points 43

J'ai rencontré un problème similaire en utilisant un formset. Dans mon exemple, je voulais que l'utilisateur sélectionne un 1er choix avant un 2e choix, mais si le 1er choix heurtait une autre erreur, l'erreur 'sélectionner le 1er choix avant le 2e' était également affichée.

Pour récupérer les données non nettoyées du premier champ, j'ai utilisé cela dans la méthode de nettoyage du champ de formulaire:

 dirty_rc1 = self.data[self.prefix + '-reg_choice_1']
 

Ensuite, je pourrais tester la présence de données dans ce champ:

 if not dirty_rc1:
    raise ValidationError('Make a first choice before second')
 

J'espère que cela t'aides!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X