我正在尝试使用Django开发一个聊天应用程序,一个用户可以邀请其他一些用户到封闭的聊天室进行通信。但是我想让用户不能邀请已经在其他活动聊天室中的其他用户。因此,在创建聊天室时,我只想显示不属于任何其他活动室的用户,因此产生了以下代码。
models.py
from django.db import models
from django.utils import timezone
from .models import User, Topic # User is a very simple extension of AbstractBaseUser
class Room(models.Model):
manager = models.ForeignKey(User, related_name='room_manage', on_delete=models.CASCADE)
users = models.ManyToManyField(User, related_name='room_user', null=False)
topic = models.ForeignKey(Topic, related_name='room', on_delete=models.CASCADE)
create_time = models.DateTimeField(default=timezone.now, editable=False)
is_active = models.BooleanField(default=True) # If the manager close the room, it becomes is_active=False
def __str__(self):
return "Created time: " + str(self.create_time)
views.py
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from .forms import RoomForm
from .models import Room
@login_required
def room_add(request):
room = Room()
room.manager = request.user
room_form = RoomForm(request.POST or None, instance=room)
if room_form.is_valid():
room_form.save()
return redirect('room:room-list')
return TemplateResponse(request, 'room/form.html', {'form': room_form})
forms.py
from django.forms import ModelForm, ModelMultipleChoiceField, CheckboxSelectMultiple
from .models import User, Room
class RoomForm(ModelForm):
players = ModelMultipleChoiceField(
widget=CheckboxSelectMultiple,
queryset=User.objects.all().difference(
User.objects.filter(room_user__is_active=True)
) # Get the complement of a subset of User who are not registered in Room with is_active=True
)
class Meta:
model = Room
fields = ['players', 'topic',]
我在这里面临的问题是,当我选择多个用户并尝试保存房间时,我发现所有用户,不仅是我选择的用户,还包括我未选择的用户,都已在房间中注册。我想问题出在RoomForm的查询集中,但是我不明白发生了什么。 我是Django的新手,所以如果我问一个简单的问题,我深表歉意。
非常感谢您的帮助!