在Django ManyToMany字段

时间:2015-11-30 23:37:18

标签: python django modelform manytomanyfield

我想在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通用视图。

我的问题是,如何只过滤用户创建的特定会议室"用户A"以会议的形式。 "用户A"无法看到"用户B"

创建的会议室

同样地,如何在没有所有房间的情况下仅选择在特定场所创建的房间? 我不想使用JavaScript。

非常感谢您的回复。

2 个答案:

答案 0 :(得分:1)

您可以从表单

覆盖查询集
#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

类似的东西。

答案 1 :(得分: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)

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