Django-fr

Forum

  • Accueil
  • » Django-fr
  • » choices dynamique depuis une table d e la base de données

#1 08-02-2011 17:07:03

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

choices dynamique depuis une table d e la base de données

Bonjour à toutes et à tous,

J'ai un form defini comme suit dans le fichier views.py, le champ projet me
permet d'obtenir une liste deroulante.
class Tasks_list_Form(forms.Form):
    action_type = forms.CharField(widget=forms.TextInput, label='Type Action
?', required=True)
    project = forms.CharField( widget=forms.Select( choices=[ ('MyCareNet',
'MyCareNet'), ('Catherine', 'Catherine')] ), required=False, label='Project'
)
    ...

J'aimerai que mes choices soit chargés dynamiquement depuis une autre table
de la base de données au lieu d'être défini en dur dans le code.
Comment puis-je faire ?

Merci pour votre aide.
Joël

Hors ligne

#2 08-02-2011 17:51:24

Chamal
Membre
Inscription : 11-08-2010
Messages : 17

Re : choices dynamique depuis une table d e la base de données

Le 8 févr. 2011 à 17:07, Joel Quinet a écrit :

> Bonjour à toutes et à tous,
>
> J'ai un form defini comme suit dans le fichier views.py, le champ projet me permet d'obtenir une liste deroulante.
> class Tasks_list_Form(forms.Form):
>     action_type = forms.CharField(widget=forms.TextInput, label='Type Action ?', required=True)
>     project = forms.CharField( widget=forms.Select( choices=[ ('MyCareNet', 'MyCareNet'), ('Catherine', 'Catherine')] ), required=False, label='Project' )
>     ...
>
> J'aimerai que mes choices soit chargés dynamiquement depuis une autre table de la base de données au lieu d'être défini en dur dans le code.
> Comment puis-je faire ?

Bonjour,

Il faut définir un nouveau modèle Project dans ton fichier models.py et faire en sorte que cet objet soit déclaré comme un champ ForeignKey dans ta classe modèle relative a Tasks_list_Form ==> Tu établis une relation entre ta liste des projets et tes tâches (une tâche a 0 ou un seul projet de rattaché).

soit a peu prêt :

class Project(models.Model):
    name = models.CharField(max_length=64)

class Task(models.Model):
    action_type = models.CharField(max_length=<jesaispasquellelongueurmettre>)

    project = models.ForeignKey(Project, null=True, blank=True)
                     ^^^^^^^^^^

Ensuite il faut remplir la table project a partir de l'interface d'admin (ou un formulaire autre) et la liste déroulante dans Tasks sera automatiquement constituée par la liste de tous tes projets.

Voir la documentation suivante sur le site de django :
http://docs.djangoproject.com/en/1.2/ref/models/fields/#module-django.db.models.fields.related

++ Aymeric

Hors ligne

#3 08-02-2011 20:02:06

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : choices dynamique depuis une table d e la base de données

Aymeric,

Ce que tu me proposes est ce que j'ai fait comme ci-dessous, je ne pense pas
qu'il y ai un problème avec celà ?
Mon problème est au niveau du form pour l'inerface utilisateur pas
l'interface d'amin voir code ci-dessous.

Merci pour ton aide,
Joël

models.py
class projects( models.Model):
    id = models.IntegerField( primary_key = True, editable = False )
    project_name = models.CharField( max_length = 50, unique = True )
    is_actif = models.BooleanField( blank = False, null = False, default =
True )

class todo( models.Model ):
    id = models.IntegerField( primary_key = True, editable = False )
    ...
    dautres_champ_sans_interet_ici
    ...
    project = models.ForeignKey( projects, null=True, blank=True )

views.py
class Tasks_list_Form(forms.Form):
    project = forms.CharField( widget=forms.Select( ), required=False,
label='Project' )
    ...
    dautres_champ_sans_interet_ici
    ...


Le 8 février 2011 17:51, Aymeric Barantal <mric _AT_ chamal.fr> a écrit :

>
> Le 8 févr. 2011 à 17:07, Joel Quinet a écrit :
>
> Bonjour à toutes et à tous,
>
> J'ai un form defini comme suit dans le fichier views.py, le champ projet me
> permet d'obtenir une liste deroulante.
> class Tasks_list_Form(forms.Form):
>     action_type = forms.CharField(widget=forms.TextInput, label='Type
> Action ?', required=True)
>     project = forms.CharField( widget=forms.Select( choices=[ ('MyCareNet',
> 'MyCareNet'), ('Catherine', 'Catherine')] ), required=False, label='Project'
> )
>     ...
>
> J'aimerai que mes choices soit chargés dynamiquement depuis une autre table
> de la base de données au lieu d'être défini en dur dans le code.
> Comment puis-je faire ?
>
>
> Bonjour,
>
> Il faut définir un nouveau modèle Project dans ton fichier models.py et
> faire en sorte que cet objet soit déclaré comme un champ ForeignKey dans ta
> classe modèle relative a Tasks_list_Form ==> Tu établis une relation entre
> ta liste des projets et tes tâches (une tâche a 0 ou un seul projet de
> rattaché).
>
> soit a peu prêt :
>
> class Project(models.Model):
>     name = models.CharField(max_length=64)
>
> class Task(models.Model):
>     action_type =
> models.CharField(max_length=<jesaispasquellelongueurmettre>)
>
>     project = models.ForeignKey(Project, null=True, blank=True)
>                      ^^^^^^^^^^
>
> Ensuite il faut remplir la table project a partir de l'interface d'admin
> (ou un formulaire autre) et la liste déroulante dans Tasks sera
> automatiquement constituée par la liste de tous tes projets.
>
> Voir la documentation suivante sur le site de django :
>
> http://docs.djangoproject.com/en/1.2/ref/models/fields/#module-django.db.models.fields.related
>
> ++ Aymeric
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 09-02-2011 00:29:10

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : choices dynamique depuis une table d e la base de données

Salut,

Tu a un champ de formulaire dédié à cela :

http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

Hors ligne

#5 09-02-2011 23:38:20

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : choices dynamique depuis une table d e la base de données

Salut,

Merci beaucoup pour le lien vers cette partie de la doc, je l'ai lue.
J'ai adapté mon code avec le code ci-dessous, le probleme est que ma page ne
m'affiche aucune données pourtant (j'ai fait un print) j'obtiens bien un
tuple de tupe avec toutes des valeurs de type string ?  Je ne vois pas quel
est le problème.

    project = forms.ModelChoiceField( tuple( [(unicode(project.id),
project.project_name) for project in projects.objects.all()] ),
empty_label=None)

Merci
Joël



Le 9 février 2011 00:29, David THENON <david.thenon _AT_ wanadoo.fr> a écrit :

> Salut,
>
> Tu a un champ de formulaire dédié à cela :
>
> http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield
>
> --
> Cordialement,
> David THENON.
>
> Le mardi 08 février 2011 17:07:03, Joel Quinet a écrit :
> > Bonjour à toutes et à tous,
> >
> > J'ai un form defini comme suit dans le fichier views.py, le champ projet
> me
> > permet d'obtenir une liste deroulante.
> > class Tasks_list_Form(forms.Form):
> >     action_type = forms.CharField(widget=forms.TextInput, label='Type
> > Action ?', required=True)
> >     project = forms.CharField( widget=forms.Select( choices=[
> ('MyCareNet',
> > 'MyCareNet'), ('Catherine', 'Catherine')] ), required=False,
> > label='Project' )
> >     ...
> >
> > J'aimerai que mes choices soit chargés dynamiquement depuis une autre
> table
> > de la base de données au lieu d'être défini en dur dans le code.
> > Comment puis-je faire ?
> >
> > Merci pour votre aide.
> > Joël
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#6 10-02-2011 03:46:19

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : choices dynamique depuis une table d e la base de données

Salut,

tu a mal interprêté l'utilisation de ce champs, contrairement à un
ChoicesField, il n'attends pas une liste de tuple (label, value), mais
directement un queryset, donc tu lui donnes juste :

  queryset=projects.objects.all()

(c'est un peu ce que tu cherchais à la base non après tout..)

Et par défaut, la liste de séléction utilisera le rendu unicode() des objets
de ton queryset pour le label des options de ta liste de séléction. Tu peux
modifier ce comportement, pour le détails c'est dans le lien que je t'ai donné.

Hors ligne

#7 10-02-2011 21:32:22

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : choices dynamique depuis une table d e la base de données

Oui, c'est exactement cela que je veux, le problème est que j'avais oublié
le code suivant pour avoir l'affichage du nom et non pas "object project".

class MyModelChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return "%s" % (obj.project_name)

Maintenant, tout fonctionne bien.
Merci
Joel

Le 10 février 2011 03:46, David THENON <david.thenon _AT_ wanadoo.fr> a écrit :

> Salut,
>
> tu a mal interprêté l'utilisation de ce champs, contrairement à un
> ChoicesField, il n'attends pas une liste de tuple (label, value), mais
> directement un queryset, donc tu lui donnes juste :
>
>  queryset=projects.objects.all()
>
> (c'est un peu ce que tu cherchais à la base non après tout..)
>
> Et par défaut, la liste de séléction utilisera le rendu unicode() des
> objets
> de ton queryset pour le label des options de ta liste de séléction. Tu peux
> modifier ce comportement, pour le détails c'est dans le lien que je t'ai
> donné.
>
> --
> Cordialement,
> David THENON.
>
> Le mercredi 09 février 2011 23:38:20, Joel Quinet a écrit :
> > Salut,
> >
> > Merci beaucoup pour le lien vers cette partie de la doc, je l'ai lue.
> > J'ai adapté mon code avec le code ci-dessous, le probleme est que ma page
> > ne m'affiche aucune données pourtant (j'ai fait un print) j'obtiens bien
> > un tuple de tupe avec toutes des valeurs de type string ?  Je ne vois pas
> > quel est le problème.
> >
> >     project = forms.ModelChoiceField( tuple( [(unicode(project.id),
> > project.project_name) for project in projects.objects.all()] ),
> > empty_label=None)
> >
> > Merci
> > Joël
> >
> > Le 9 février 2011 00:29, David THENON <david.thenon _AT_ wanadoo.fr> a écrit
> :
> > > Salut,
> > >
> > > Tu a un champ de formulaire dédié à cela :
> > >
> > >
> http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield
> > >
> > > --
> > > Cordialement,
> > > David THENON.
> > >
> > > Le mardi 08 février 2011 17:07:03, Joel Quinet a écrit :
> > > > Bonjour à toutes et à tous,
> > > >
> > > > J'ai un form defini comme suit dans le fichier views.py, le champ
> > > > projet
> > >
> > > me
> > >
> > > > permet d'obtenir une liste deroulante.
> > > >
> > > > class Tasks_list_Form(forms.Form):
> > > >     action_type = forms.CharField(widget=forms.TextInput, label='Type
> > > >
> > > > Action ?', required=True)
> > > >
> > > >     project = forms.CharField( widget=forms.Select( choices=[
> > >
> > > ('MyCareNet',
> > >
> > > > 'MyCareNet'), ('Catherine', 'Catherine')] ), required=False,
> > > > label='Project' )
> > > >
> > > >     ...
> > > >
> > > > J'aimerai que mes choices soit chargés dynamiquement depuis une autre
> > >
> > > table
> > >
> > > > de la base de données au lieu d'être défini en dur dans le code.
> > > > Comment puis-je faire ?
> > > >
> > > > Merci pour votre aide.
> > > > Joël
> > >
> > > _______________________________________________
> > > 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

  • Accueil
  • » Django-fr
  • » choices dynamique depuis une table d e la base de données

Pied de page des forums