Django: ManyToManyField сохраняет выбор, который я не ставлю чеки - PullRequest
0 голосов
/ 21 октября 2019

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

Большое спасибо за вашу помощь!

...