我想在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。
非常感谢您的回复。
答案 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,我应该有经过身份验证的用户的名字。