IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Liste de choix dans formulaire


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut Liste de choix dans formulaire
    Bonsoir/Bonjour


    Je suis confronté à une problématique et à quelques questions sur les formulaires et les listes de choix.

    J'utilise plusieurs models dans une applications, le premier tournois/models.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class Tournois(models.Model):
        nom=models.CharField(max_length=100, verbose_name="Nom du Tournois")
        date=models.DateTimeField(auto_now_add=True, auto_now=False,\
                                  verbose_name="Créé le:")
        description=models.TextField(blank=True)
        en_ligne=models.BooleanField(default=False, verbose_name="Mettre en ligne le")
     
        communaute=models.ForeignKey(Communaute, verbose_name="Nom de la communauté")
        evenement=models.ManyToManyField(Evenement, through='JournalEvenement',\
                                         verbose_name="Evènement du tournois")
        participants=models.ManyToManyField(User, through='JournalParticipant',\
                                            verbose_name="Participants", blank=True)
     
        def __unicode__(self):
            return self.nom
    Le second parier/models.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Evenement(models.Model):
        nom=models.CharField(max_length=100, verbose_name="Nom de l'évènement")
        date_debut=models.DateTimeField(auto_now_add=False, auto_now=False, verbose_name="Date de début de l'évènement")   
        date_fin=models.DateTimeField(auto_now_add=False, auto_now=False,verbose_name="Date de fin de l'évènement")
        clos=models.BooleanField(default=False,  verbose_name="Evènement clos=gagnant connu (cocher pour OUI)")
        egalite=models.BooleanField(default=False, verbose_name="Possibilité d'égalité (cocher pour OUI)")
        competition=models.ForeignKey(Competition, verbose_name="Competition concernée")
        competiteurs=models.ManyToManyField(Competiteur, verbose_name="Compétiteurs engagés") 
        def __unicode__(self):
            return self.nom
    Je souhaiterai créer un formulaire pour que les utilisateurs puissent créer un tournois. Les utilisateurs peuvent ensuite choisir des événements pour le tournois et inviter des participants. Je souhaiterai afficher QUE les événements qui n'ont pas encore commencés, c'est à dire que la date de début (evenement.date_debut) est supérieur au moment d'affichage du formulaire.
    Malheureusement mon fichier tournois/forms.py me retourne l'ensemble des événement et je ne sais pas comment filtrer mes événements sur des critères précis.
    Même chose pour les participants, je souhaiterai afficher que les utilisateurs qui sont dans la communauté du tournois (le champs communaute dans le fichier tournois/models.py)

    Mon fichier forms.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class TournoisCreerForm(forms.ModelForm):
        nom=forms.CharField(max_length=100, label="Nom du tournois")
        description=forms.CharField(widget=forms.Textarea, label="Descriptif du tournois")
        en_ligne=forms.BooleanField(label="Mettre en ligne le tournois")
        class Meta:
            model=Tournois
            exclude=('date',)
    Auriez-vous quelques pistes pour ce problème que je risque de croiser de nombreuses fois ? ...

    J'utilise window seven, django 1.5 et python 3.3

  2. #2
    Membre expérimenté Avatar de Stopher
    Homme Profil pro
    Responsable technique
    Inscrit en
    Juin 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 198
    Par défaut
    Salut,

    tu peux utiliser le paramètre "queryset" dans la définition d'un formset ( modelform )

    https://docs.djangoproject.com/en/de...g-the-queryset

    Je pense que ça peu répondre à ta problématique .

    Ch.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Merci de ton aide, cela répond en partie à mon problème

    J'ai donc écrit cela dans le fichier tournois/forms.py pour la partie concernant la sélection d'un événement dont la date de début (evenement.date_debut) est supérieur à la date actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    evenement = forms.ModelMultipleChoiceField(queryset=Evenement.objects.filter(date_debut__gt=datetime.now),\
                                                   label="Liste des événements")
    Ici pas de problème j'ai fait des tests cela fonctionne.

    Mon problème ce trouve au niveau des utilisateurs. Je ne souhaite afficher que les utilisateurs fesant partie de la communauté qui organise le tournois.
    Comment faire un filtre dynamique comme celui-là pour que mon formulaire géré soit correct.
    J'ai essayé de faire cela, sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from communaute.models import Communaute
    from django.shortcuts import get_object_or_404
     
    class TournoisCreerForm(forms.ModelForm, id): 
         communaute=get_object_or_404(Communaute, id=id)
    Mais j'ai un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
    Première fois que je vois ce message, c'est la journée des nouveautés ^^
    Je ne sais pas comment récupérer l'information et l'appliquer à mon filter()...

    J'ai également deux questions en lien avec les formulaires et le fameux ModelMultipleChoiceField() :

    - est-il possible de ne pas utiliser la touche ctrl pour sélectionner plusieurs choix dans la liste (simplement en cliquant dessus) ?
    - actuellement je n'affiche que le evenement.nom pour ma liste des événements. Est-il possible d'afficher plusieurs chose et plusieurs champs dans le ModelMultipleChoiceField() ?


    Merci de votre aide

  4. #4
    Membre expérimenté Avatar de Stopher
    Homme Profil pro
    Responsable technique
    Inscrit en
    Juin 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Responsable technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 198
    Par défaut
    Pour le message d'erreur , c'est normal ....

    Tu essayes de passer un paramètre dans la signature de ta classe, là ou tu indiques si elle dérive d'une autre classe parent ( forms.ModelForm dans ton cas ).

    Pour passer un paramètre à l'instanciation de ta classe, tu dois le spécifier dans le constructeur .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from communaute.models import Communaute
    from django.shortcuts import get_object_or_404
     
    #TournoisCreerForm derive de forms.ModelForm . 'id' n'a rien à faire ici
    class TournoisCreerForm(forms.ModelForm, id): 
         communaute=get_object_or_404(Communaute, id=id)
    Avec le constructeur c'est mieux pour passer des paramétres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    from communaute.models import Communaute
    from django.shortcuts import get_object_or_404
     
    #TournoisCreerForm derive de forms.ModelForm . 'id' n'a rien à faire ici
    class TournoisCreerForm(forms.ModelForm, id): 
     
         def __init__(self,id_com=None,*args,**kwargs):
             super(TournoisCreerForm, self).__init__(*args,**kwargs)
     
             self.id_com = id_com
             self.fields['communaute'] = get_object_or_404(Communaute, id=id_com)
     
        #communaute = ... pas besoin car déjà déclaré dans le constructeur
    - est-il possible de ne pas utiliser la touche ctrl pour sélectionner plusieurs choix dans la liste (simplement en cliquant dessus) ?
    C'est plus de l'enrichissement de formulaire que des options natifs .. regarde plutôt du coté de JS plugins Jquery ...

    - actuellement je n'affiche que le evenement.nom pour ma liste des événements. Est-il possible d'afficher plusieurs chose et plusieurs champs dans le ModelMultipleChoiceField() ?
    Dans le template tu fais ce que tu veux au niveau de l'affichage, tu n'est pas obligé de garder l'affichage généré automatiquement pour tt les champs .

    Sinon il me semble que tu peux définir tes propres widgets d'affichage ... mais j'ai jamais fait :/

    En espérant t'avoir aidé .

    Ch.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Par défaut
    Bonjour.

    Même chose pour ce topic, je n'arrive pas à appliquer la solution proposée.
    J'ai donc essayé le code que tu m'as envoyé que j'ai intégré à mon code existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class TournoisCreerForm(forms.ModelForm):
        nom=forms.CharField(max_length=100, label="Nom du tournois")
        description=forms.CharField(widget=forms.Textarea, label="Descriptif du tournois")
        en_ligne=forms.BooleanField(label="Mettre en ligne le tournois")
        evenement = forms.ModelMultipleChoiceField(queryset=Evenement.objects.filter(date_debut__gt=datetime.now),\
                                                   label="Liste des événements")
     
        def __init__(self, id_com=None,*args,**kwargs):
            super(TournoisCreerForm,self).__init__(*args,**kwargs)
            self.id_com=id_com
            self.fields['communaute']=get_object_or_404(Communaute, id=id_com)
     
        class Meta:
            model=Tournois
    Bon déjà je sais pas si cela est bon (je débute hein ^^ )
    J'obtiens une erreur 404 car j'ai cela, je suppose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, id_com=None,*args,**kwargs):
    Cependant en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self, id_com=1,*args,**kwargs):
    Pour ma première communauté, ma page est bien chargée, mais avec l'ensemble des user (et non ceux qui font partie de la communautée).

    Bref je suis encore et de nouveau bloqué, sans réellement comprendre ce que j'écris ^^

Discussions similaires

  1. [2.x] changer la valeur d'une liste de choix dans formulaire
    Par nlefebvre1 dans le forum Symfony
    Réponses: 2
    Dernier message: 21/09/2014, 22h41
  2. [2.x] changer la valeur d'une liste de choix dans formulaire
    Par nlefebvre1 dans le forum Symfony
    Réponses: 0
    Dernier message: 21/09/2014, 21h36
  3. Taille du bouton liste de choix dans formulaire
    Par Poisell dans le forum IHM
    Réponses: 5
    Dernier message: 17/12/2007, 17h26
  4. Réponses: 1
    Dernier message: 23/03/2007, 19h33
  5. [Formulaire] filtrer liste par choix dans autre liste
    Par vatounet dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2005, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo