Résolue

Champ de formulaire dynamique

# Django # API # Formulaires

salut l'équipe, j'ai visionné les vidéos sur l'utilisation de l'api fetch et j'aimerais m'en inspirer dans un formulaire dont un des champs doit être mis à jour en fonction du choix effectué dans un champ précédent.
J'ai un champ "spécialité" de type liste déroulante et en fonction du choix de celle ci, le champ suivant ("médecin") est actualisé, il est également de type liste déroulante.
Voic à quoi cela ressemble avec l'emploi d'un modelForm :

et voici le code du formulaire séjour :

class CreateSejour(forms.ModelForm):
    medecin = forms.ModelChoiceField(queryset=Medecin.objects.none(), required=False)

    class Meta:
        model = Sejour
        fields = '__all__'
        widgets = {'date_entree': forms.SelectDateWidget(years=range(2015, 2025)),
                   'date_sortie': forms.SelectDateWidget(years=range(2015, 2025)),
                   'motif': forms.Textarea()}

    def __init__(self, *args, **kwargs):
        super(CreateSejour, self).__init__(*args, **kwargs)
        self.fields['medecin'].queryset = Medecin.objects.none()
        print(self.data)

        if "specialite" in self.data.keys():
            print("yess")
            try:
                specialite_id = int(self.data.get('specialite'))
                print(f"specialité {specialite_id}")
                self.fields['medecin'].queryset = Medecin.objects.filter(specialite_id=specialite_id).order_by('nom')
                print(self.fields['medecin'].queryset)
            except (ValueError, TypeError):
                pass
        elif self.instance.pk and self.instance.specialite:
            self.fields['medecin'].queryset = self.instance.specialite.medecin_set.order_by('nom')

J'avoue que je ne vois pas trop comment m'y prendre :

  • dois-je supprimer le champ "médecin" du formulaire et rajouter un formulaire pour ce champs uniquement, qui serait mis à jour en fonction de la spécialité en utilisant fetch?

  • est-ce que la logique doit être déplacée dans la vue et non pas dans le formulaire ?

Merci pour votre aide.
Ali

Thibault houdon

Mentor

Salut Ali !

C'est effectivement un cas d'usage courant et intéressant. Ça serait un bon moyen de découvrir HTMX.

Tu peux aussi le faire avec fetch cependant, HTMX est juste une façon plus facile de le faire.

Tu pourrais avoir deux formulaires et deux vues et quand tu sélectionnes une option dans le premier formulaire, détecter ce changement (avec du javascript simple et fetch, ou avec un "trigger" HTMX) et aller chercher dans une autre vue les données du 2e formulaire, en fonction des données du 1er.

Donc oui pour moi le plus logique serait d'avoir un formulaire en deux étapes, plutôt que d'essayer de tout faire dans un formulaire.

Salut Thibault, dans l'attente d'une réponse, j'ai réalisé qu'il fallait que je me plonge un peu dans javascript.
Je pense comprendre la méthodologie. je vais jeter un oeil aussi à HTMX.
Merci!
Ali

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.