Я пытаюсь разработать приложение для чата с 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)
просмотров.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, поэтому я прошу прощения, если задаю простой вопрос.
Большое спасибо за вашу помощь!