2010-12-02 17 views
11

J'ai une liste déroulante de liste de sélection sur mon formulaire qui est rempli avec des données d'un modèle (directeurs). La valeur de cette liste déroulante n'a pas besoin d'être sauvegardée; il n'est vraiment utilisé que pour dynamiquement déclencher un autre élément de la forme (une liste déroulante intitulée Films). Ainsi, lorsque l'utilisateur choisit un directeur, il remplit dynamiquement la deuxième liste avec les films attachés à ce directeur.Remplacer la validation des données sur un élément de formulaire django

Le premier élément de la première liste est "Tous les administrateurs". Au lieu de filtrer la liste des films, tous les films sont affichés dans la deuxième liste parce que tous les réalisateurs sont choisis.

Si l'utilisateur choisit un directeur spécifique puis un film, le formulaire est correctement soumis. Le problème est que si l'utilisateur choisit Tous les réalisateurs, puis sélectionne un film, quand le formulaire est soumis, il me dit que mon choix pour les directeurs n'est pas valide parce que ce n'est pas l'un des choix disponibles. Dans ce cas, un choix disponible (je suppose) est l'un des objets Director.objects existants dans la base de données. Mais parce que je ne me soucie pas du directeur, je n'ai pas besoin que cette entrée soit valide. J'ai juste besoin de Film pour être valide.

J'utilise un ModelForm. Comment désactiver ou remplacer la validation des données dans le champ du formulaire Director afin qu'il ignore l'erreur générée par ce champ?

Répondre

26

L'approche la plus simple serait de définir votre propre méthode pour valider la forme, comme ceci:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = WhateverModel 

    def clean(self): 
     super(MyForm, self).clean() #if necessary 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
     return self.cleaned_data        

Voir http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other pour une explication plus complète et http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method pour son application à ModelForms.

+0

'super (MyForm, self) .clean()' cela permettra-t-il que la validation par modèle par défaut soit toujours active? – andi

+0

Oui. Avant d'atteindre la méthode de nettoyage du formulaire, les validateurs de champ ont déjà été exécutés. Vous pouvez vérifier s'ils ont généré des erreurs dans l'attribut "errors" du formulaire. (Django 1.8) –

6

Pour une raison quelconque la réponse acceptée ne fonctionne pas pour moi (je ne sais pas si ce sont des choses de cause ont changé, ou que je suis en utilisant un formulaire en ligne ou quoi), mais full_clean primordial travaillé:

class MyForm(forms.ModelForm): 
    def full_clean(self): 
     super(MyForm, self).full_clean() 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
+0

Je seconde ce que dit @Jack. – prinzdezibel