2015-11-30 1 views
1

Je souhaite filtrer les données dans le champ Django ManyToMany.Filtrer les données initiales dans le champ Django ManyToMany

L'application crée des réunions qui se déroulent dans certaines salles situées dans certains lieux.

De nombreuses personnes peuvent créer des réunions, mais une seule personne peut simplement accéder aux lieux et salles qu'elle a créés.

Mes modèles sont (par exemple):

class Room(models.Model): 
    name = models.CharField(max_length=100) 
    capacity = models.IntegerField() 

    def __str__(self): 
     return self.name 

    def get_absolute_url(self): 
     return reverse('venue:room_detail', kwargs={'pk':self.pk}) 

class Venue(models.Model): 
    creator = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    rooms = models.ManyToManyField(Room) 

    def __str__(self): 
     return self.name 

    def get_absolute_url(self): 
     return reverse('venue:venue_detail', kwargs={'pk':self.pk}) 

class Meeting(models.Model): 
    name = models.CharField(max_length=100) 
    venue = models.ForeignKey(Venue) 
    room = models.ForeignKey(Room) 

J'utilise des vues génériques de Django dans mon application.

Ma question est, comment puis-je filtrer seulement les pièces spécifiques créées par un utilisateur "Utilisateur A" sous la forme de réunion. "Utilisateur A" ne peut pas voir les pièces créées par "Utilisateur B"

De la même manière, comment puis-je sélectionner uniquement les pièces créées dans un lieu spécifique sans toutes les pièces? Je ne veux pas utiliser JavaScript s'il vous plaît.

Un grand merci pour vos réponses.

Répondre

1

Vous pouvez remplacer les queryset de la forme

#constructor from form 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user', None) 
    super(ObjectForm, self).__init__(*args, **kwargs) 
    if user: 
     self.fields['rooms'].queryset = Room.objects.filter(room__venue_creator=user) 

Vous devez changer ObjectForm avec le nom de votre formulaire

Quelque chose comme ça.

+0

Merci @Angel Cruijff pour votre réponse de cesser de fumer. J'ai essayé votre proposition et j'ai lu beaucoup d'autres tutos qui ont fait exactement ce que vous avez fait. Malheureusement, ça ne marche pas avec moi. J'ai peur de perdre quelque chose. J'essaie de tracer mon code en ajoutant print ('L'utilisateur est:', utilisateur) après la ligne "user = kwargs.pop ('user', None)" et il imprime "None" dans le terminal. Donc, je ne peux pas accéder à l'utilisateur. J'essaie d'importer l'utilisateur par: à partir de django.contrib.auth.models import User. Mais ça n'aide pas. Tout indice pour résoudre ce problème s'il vous plaît? –

+0

Où est la relation entre les chambres et le créateur @RufinHounkpe ??? Je ne le vois pas. –

+0

Aucune relation entre Room et le créateur. C'est le site a un créateur et il y a un lien entre la salle et le lieu via les chambres = models.ManyToManyField (Room) in Venue. Si je peux accéder au créateur de Venue, alors je peux accéder au reste des données. Dans le constructeur de la forme, juste après la première ligne, utilisez: user = kwargs.pop ('user', None). J'ai ajouté juste après cette ligne: print (user) et il imprime None. Je suppose que cet utilisateur fait référence à l'utilisateur authentifié. –

1

@angel

class Room(models.Model): 
    name = models.CharField(max_length=100) 

class Venue(models.Model): 
    creator = models.ForeignKey(User) 
    name = models.CharField(max_length=100) 
    rooms = models.ManyToManyField(Room, through="VenueRooms") 

class VenueRooms(models.Model): 
    venue = models.ForeignKey(Venue) 
    room = models.ForeignKey(Room) 

class Meeting(models.Model): 
    name = models.CharField(max_length=100) 
    venue = models.ForeignKey(Venue) 
    room = models.ForeignKey(Room) 

class MeetingForm(ModelForm): 
    class Meta: 
     model = Meeting 
     fields = ('name', 'venue', 'room',) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     print(user) # it prints None 
     super(MeetingForm, self).__init__(*args, **kwargs) 

Ce sont les modèles et les ModelForm pour MeetinfForm où je suis en train d'avoir accès à l'queryset des chambres et venur créées par un utilisateur spécifique. Je suppose que l'utilisateur est référé à l'utilisateur authentifié. C'est comme request.user; donc en imprimant l'utilisateur dans le shell, je devrais avoir le nom de l'utilisateur authentifié.