在 Django ManyToMany 字段中过滤初始数据

Filterig initial data in Django ManyToMany field

我想过滤 Django ManyToMany 字段中的数据。

该应用程序创建的会议在位于某些场所的某些房间中举行。

多人可以创建会议,但一个人只能访问他创建的场地和房间。

我的模型是(示例):

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)

我在我的应用程序中使用 Django 通用视图。

我的问题是,如何以会议的形式仅过滤用户"User A"创建的特定房间。 "User A" 看不到 "User B"

创建的房间

同理,我怎么能select只有在特定地点创建的房间而不是所有房间? 我不想使用 JavaScript,请。

非常感谢您的回复。

您可以覆盖表单中的查询集

#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)

您需要将 ObjectForm 更改为表单名称

类似的东西。

@天使

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)

这是 MeetinfForm 的模型和 ModelForm,我试图在其中访问特定用户创建的房间和 venur 的查询集。 我想该用户是指经过身份验证的用户。就像 request.user;所以通过打印用户 un shell,我应该有经过身份验证的用户的名字。