Django-fr

Forum

#1 19-12-2015 17:54:39

darkweizer
Membre
Inscription : 19-12-2015
Messages : 1

Lier deux ModelChoiceField dans un formulaire

Bonjour,

J'ai deux tables :
[models.py]
class Departement(models.Model):
    code_insee = models.CharField(max_length=3, null=False, blank=False)
    nom = models.CharField(max_length=26, null=False, blank=False)

class Ville(models.Model):
    departement = models.ForeignKey(Departement)
    nom = models.CharField(max_length=26, null=False, blank=False)
    code_postal = models.CharField(max_length=5, null=False, blank=False)

J'arrive à afficher tous les départements dans un ModelChoiceField et toutes les villes dans un autre ModelChoiceField grâce à :
[forms.py]
a = u'Département'
departement = ModelChoiceField(
       queryset=Departement.objects.all(),
       widget=Select(attrs={
             'class': 'col s11 right'}),
       error_messages=e)

a = u'Ville'
ville = ModelChoiceField(
       queryset=Ville.objects.all(),
       widget=Select(attrs={
           'class': 'col s11 right'}),
       error_messages=e)

Ce que je voudrais, c'est afficher les villes selon le département que j'ai sélectionné dans le premier ModelChoiceField.
Exemple :
    Je sélectionne le département de la Vendée et je n'ai que les villes de Vendée qui s'affiche dans mon second ModelChoiceField.

Si quelqu'un a une solution, je suis preneur !
Merci.

Cordialement.

Dernière modification par darkweizer (19-12-2015 17:55:10)

Hors ligne

#2 08-08-2016 11:57:47

ozgrow
Membre
Inscription : 08-08-2016
Messages : 8

Re : Lier deux ModelChoiceField dans un formulaire

peut être une piste avec l'option : limit_choices_to ( cf ci dessous )

A voir si on peut passer l'argument comme ca  :limit_choices_to={'departement': code_insee.Departement}

sans certitudes mais cela vaut le cout de tester.

lien : https://docs.djangoproject.com/fr/1.10/ … db/models/

ForeignKey.limit_choices_to¶

    Définit une limite des choix disponibles pour ce champ lorsqu'il est affiché par un ModelForm ou dans le site d'administration (par défaut, tous les objets du jeu de requête sont offerts comme choix). Cette limite peut être un dictionnaire, un objet Q ou un objet exécutable renvoyant un dictionnaire ou un objet Q.

    Par exemple :

    staff_member = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        limit_choices_to={'is_staff': True},
    )

    fait que le champ correspondant du formulaire ModelForm ne présente que la liste des Users ayant is_staff=True. Cela peut être utile dans l'administration de Django.

    La forme « objet exécutable » peut être pratique par exemple quand on l'utilise avec le module Python datetime pour limiter les choix possibles en fonction d'intervalles de temps. Par exemple :

Hors ligne

Pied de page des forums