Django-fr

Forum

#1 26-09-2014 17:37:26

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Exclure des lignes dans un ModelForm

Bonjour,

Voici un extrait de mon models.py

class Auteur(models.Model):
    auteurNom = models.CharField('Nom', max_length=200)
    ....

class Livre(models.Model):
    auteur = models.ForeignKey('Auteur')
    titre = models.CharField('titre', max_length=200)
    ....

class Commentaire(models.Model):
    livre = models.ForeignKey('Livre')
    com = models.CharField('Commentaires', max_length=200)
    ....




Je fais le nécessaire pour accéder à une page dont l'URL pour être : localhost:8000/auteur/1/ pour le premier auteur de ma BDD.
Je souhaite y ajouter un formulaire afin de créer un commentaire sur un livre de l'auteur.

J'ai donc commencé par créer un ModelForm comme suit :
class FormCom(ModelForm):
    class Meta:
        model = Commentaire
        fields = ['livre', 'com']


Je peux donc ainsi avoir sur ma page web un combobox avec les livres entrés dans ma BDD et une zone me permettant de faire un commentaire.
Le souci est que là j'ai TOUS les livres de ma BDD, alors que moi j'aimerai n'avoir évidemment que ceux de l'auteur dont l'id est 1.

Donc lorsque je charge ma page depuis views.py j'aimerai pouvoir exclure les livres qui ne sont pas de l'auteur choisi, c'est à dire en gros un truc du genre :

def com(request, auteur):
   
    formCom = FormCom(avec_uniquement_livre_de_auteur)
   
    ....

    return render(request, 'business/record.html',{'com':formCom,
                                                                                  ....}
                              )


J'espère avoir été assez clair.
Est-ce possible ?

Si ce n'est pas le cas je vais devoir faire un truc du genre :

Livre.objects.filter(auteur = auteur)

et dans mon formulaire web ajouter manuellement un combobox ...  un peu galère smile

D'avance merci à tous.


Charlie

Hors ligne

#2 26-09-2014 18:42:05

Arthur Vuillard
Membre
Inscription : 21-07-2016
Messages : 9

Re : Exclure des lignes dans un ModelForm

Hello
Je répond vite fait sans vérifier. Les déclarations de Model et de Form
ont l'air correct. À l'instanciation du form, il faut faire :

formCom = FormCom()
formCom.fields['livre'].queryset = Livre.objects.filter(auteur=un_auteur)


Plus d'infos sur : https://docs.djangoproject.com/en/1.7/ref/forms/fields/#django.forms.ModelChoiceField.queryset

Arthur



Le 26/09/2014 18:37, Charlie Gentil a écrit :
> Bonjour,
>
> Voici un extrait de mon models.py
>
> class Auteur(models.Model):
>      auteurNom = models.CharField('Nom', max_length=200)
>      ....
>
> class Livre(models.Model):
>      auteur = models.ForeignKey('Auteur')
>      titre = models.CharField('titre', max_length=200)
>      ....
>
> class Commentaire(models.Model):
>      livre = models.ForeignKey('Livre')
>      com = models.CharField('Commentaires', max_length=200)
>      ....
>
>
>
>
> Je fais le nécessaire pour accéder à une page dont l'URL pour être : localhost:8000/auteur/1/ pour le premier auteur de ma BDD.
> Je souhaite y ajouter un formulaire afin de créer un commentaire sur un livre de l'auteur.
>
> J'ai donc commencé par créer un ModelForm comme suit :
> class FormCom(ModelForm):
>      class Meta:
>          model = Commentaire
>          fields = ['livre', 'com']
>
>
> Je peux donc ainsi avoir sur ma page web un combobox avec les livres entrés dans ma BDD et une zone me permettant de faire un commentaire.
> Le souci est que là j'ai TOUS les livres de ma BDD, alors que moi j'aimerai n'avoir évidemment que ceux de l'auteur dont l'id est 1.
>
> Donc lorsque je charge ma page depuis views.py j'aimerai pouvoir exclure les livres qui ne sont pas de l'auteur choisi, c'est à dire en gros un truc du genre :
>
> def com(request, auteur):
>    
>     formCom = FormCom(avec_uniquement_livre_de_auteur)
>    
>     ....
>
>     return render(request, 'business/record.html',{'com':formCom,
>                                                                                    ....}
>                                )
>
>
> J'espère avoir été assez clair.
> Est-ce possible ?
>
> Si ce n'est pas le cas je vais devoir faire un truc du genre :
>
> Livre.objects.filter(auteur = auteur)
>
> et dans mon formulaire web ajouter manuellement un combobox ...  un peu galère smile
>
> D'avance merci à tous.
>
>
> Charlie
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#3 27-09-2014 11:33:59

Doline
Membre
Inscription : 06-08-2014
Messages : 22

Re : Exclure des lignes dans un ModelForm

Salut,

Merci pour ta solution qui fonctionne nikel.
Entre temps j'avais trouvé la (demie) solution suivante :

class FormCom(ModelForm):
    def __init__(self, auteurAct, *args, **kwargs):
        super(FormCom, self).__init__(*args, **kwargs)
        if type(auteurAct) == str:
            self.fields['livre'].queryset = Livre.objects.filter(auteur=auteurAct)
       
    class Meta:
        model = Commentaire
        fields = ['livre', 'com']


Avec une instanciation comme suit :
formCom = FormCom(auteur)



Je dis demie solution car cela fait bien le travail recherché (filtrer les livres de l'auteur voulu), mais par contre mon formulaire n'est pas valide au moment de l'enregistrement.

Alors qu'avec ta solution tout ce passe à merveille.

Merci.

Charlie



Le vendredi 26 septembre 2014, 19:42:05 Arthur Vuillard a écrit :
>
> Hello
> Je répond vite fait sans vérifier. Les déclarations de Model et de Form
> ont l'air correct. À l'instanciation du form, il faut faire :
>
> formCom = FormCom()
> formCom.fields['livre'].queryset = Livre.objects.filter(auteur=un_auteur)
>
>
> Plus d'infos sur : https://docs.djangoproject.com/en/1.7/ref/forms/fields/#django.forms.ModelChoiceField.queryset
>
> Arthur
>
>
>
> Le 26/09/2014 18:37, Charlie Gentil a écrit :
> > Bonjour,
> >
> > Voici un extrait de mon models.py
> >
> > class Auteur(models.Model):
> >      auteurNom = models.CharField('Nom', max_length=200)
> >      ....
> >
> > class Livre(models.Model):
> >      auteur = models.ForeignKey('Auteur')
> >      titre = models.CharField('titre', max_length=200)
> >      ....
> >
> > class Commentaire(models.Model):
> >      livre = models.ForeignKey('Livre')
> >      com = models.CharField('Commentaires', max_length=200)
> >      ....
> >
> >
> >
> >
> > Je fais le nécessaire pour accéder à une page dont l'URL pour être : localhost:8000/auteur/1/ pour le premier auteur de ma BDD.
> > Je souhaite y ajouter un formulaire afin de créer un commentaire sur un livre de l'auteur.
> >
> > J'ai donc commencé par créer un ModelForm comme suit :
> > class FormCom(ModelForm):
> >      class Meta:
> >          model = Commentaire
> >          fields = ['livre', 'com']
> >
> >
> > Je peux donc ainsi avoir sur ma page web un combobox avec les livres entrés dans ma BDD et une zone me permettant de faire un commentaire.
> > Le souci est que là j'ai TOUS les livres de ma BDD, alors que moi j'aimerai n'avoir évidemment que ceux de l'auteur dont l'id est 1.
> >
> > Donc lorsque je charge ma page depuis views.py j'aimerai pouvoir exclure les livres qui ne sont pas de l'auteur choisi, c'est à dire en gros un truc du genre :
> >
> > def com(request, auteur):
> >    
> >     formCom = FormCom(avec_uniquement_livre_de_auteur)
> >    
> >     ....
> >
> >     return render(request, 'business/record.html',{'com':formCom,
> >                                                                                    ....}
> >                                )
> >
> >
> > J'espère avoir été assez clair.
> > Est-ce possible ?
> >
> > Si ce n'est pas le cas je vais devoir faire un truc du genre :
> >
> > Livre.objects.filter(auteur = auteur)
> >
> > et dans mon formulaire web ajouter manuellement un combobox ...  un peu galère smile
> >
> > D'avance merci à tous.
> >
> >
> > Charlie
> > _______________________________________________
> > django mailing list
> > django _AT_ lists.afpy.org
> > http://lists.afpy.org/mailman/listinfo/django
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums