Vous n'êtes pas identifié(e).
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
D'avance merci à tous.
Charlie
Hors ligne
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
>
> D'avance merci à tous.
>
>
> Charlie
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
Hors ligne
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
> >
> > 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