Créer un champ lié à deux tables

Le titre est inexact.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour tout le monde,

Voilà, je travaille sur un projet de site web en Python que j'espère pouvoir rapidement vous présenter dans la section adaptée. Malheureusement je bute sur une bêtise.

Voici la description du système en question :

  • J'ai des membres et des organisations (class Member et Organization).
  • Les organisations ont des propriétaires (owners) qui sont des membres.
  • Les organisations acceptent automatiquement ou non les membres qui le demande.

Je souhaite que les propriétaires d'un ou plusieurs groupes puissent valider les demandes d'adhésions aux groupes dont ils sont propriétaires. L'idée c'est d'avoir un formulaire sous la forme d'une liste à cocher :

1
2
3
O Marius souhaite rejoindre l'organisation Couture
O Jacky souhaite rejoindre l'organisation Tunning
O ...

Le code suivant me permet de lister les membres qui souhaitent rejoindre les groupes dont je suis propriétaire. Il fonctionne également lorsque je suis administrateur de deux groupes différents et que le même membre souhaite rejoindre les deux groupes : son nom apparait deux fois dans la liste.

Mon problème, c'est que je ne sais pas comment récupérer, pour chaque membre à sélectionner, l'organisation que ce dernier cherche à rejoindre.

Un petit coup de main serait fort apprécié ! :)


Mes modèles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Member(models.Model):
    user = models.OneToOneField('auth.User',default=0)    

    friends = models.ManyToManyField('Member', blank=True,null=True,related_name='member_friends')
    friends_pending = models.ManyToManyField('Member', blank=True,null=True,related_name='member_friends_pending')

    organizations = models.ManyToManyField('Organization', blank=True,null=True,related_name='member_organizations')
    organizations_pending = models.ManyToManyField('Organization', blank=True,null=True,related_name='member_organizations_pending')

    auto_accept_friends = models.BooleanField(default=True)

    answered_questions = models.ManyToManyField('qcm.AnsweredQuestion',blank=True,null=True)

    def __str__(self):
        return self.user.get_username()

    def get_score(self):
        return sum([question.get_score() for question in self.answered_questions.all()])


class Organization(models.Model):
    group = models.OneToOneField('auth.Group',blank=True,null=True)
    organization_type = models.ManyToManyField('OrganizationType')

    owners = models.ManyToManyField('Member',blank=True,null=True,related_name='organization_owners')

    auto_accept = models.BooleanField(default=False)
    is_open = models.BooleanField(default=True)

    name = models.CharField(max_length=50)
    desc = models.TextField(blank=True,null=True)

    def __str__(self):
        return self.name

Mon formulaire :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class ConfirmOrganizationMemberForm(forms.Form):
    members = forms.ModelMultipleChoiceField(
        queryset=None,
        widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        owner_pk = kwargs.pop('owner_pk')
        super(ConfirmOrganizationMemberForm, self).__init__(*args, **kwargs)

        self.fields['members'].queryset = Member.objects.filter(organizations_pending__in=Organization.objects.filter(owners=owner_pk).all())

Pour donner une idée, voici le code rendu par Django. Comme on peut le voir, value est le même pour les deux et correspond à l'id du membre. J'en déduis que ma technique est mauvaise, car Django va probablement pas voir la différence si je coche l'un ou l'autre.

Bref, la panade.

1
2
<label for="id_members_0"><input id="id_members_0" name="members" type="checkbox" value="2" /> gregoire</label>
<label for="id_members_1"><input id="id_members_1" name="members" type="checkbox" value="2" /> gregoire</label>

Édité par Fulbert

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte