Приложение чата Django Channels не открывает ветку, если пользователь совпадает с зарегистрированным администратором - PullRequest
0 голосов
/ 25 апреля 2019

Я новичок в каналах Django и слежу за этим уроком на YouTube

https://www.youtube.com/watch?v=RVH05S1qab8

Все настройки работают отлично, но теперь я был поражен конфликтом в видео и общим кодом git hub. В видео, если вы точно зависли на 47:44, он покажет вам экран, на котором открыты 2 окна браузера со следующими URL,

127.0.0.1: 8000 / сообщения / jmitchell3 / 127.0.0.1:8000/messages/cfe/

Здесь обратите внимание, что cfe - это пользователь, вошедший в систему администратора django.

Теперь код менеджера модели говорит следующее:

class ThreadManager(models.Manager):
    def by_user(self, user):
        qlookup = Q(first=user) | Q(second=user)
        qlookup2 = Q(first=user) & Q(second=user)
        qs = self.get_queryset().filter(qlookup).exclude(qlookup2).distinct()
        return qs

    def get_or_new(self, user, other_username): # get_or_create
        username = user.username

        if username == other_username:
            return None, False

        qlookup1 = Q(first__username=username) & Q(second__username=other_username)
        qlookup2 = Q(first__username=other_username) & Q(second__username=username)

        qs = self.get_queryset().filter(qlookup1 | qlookup2).distinct()

        if qs.count() == 1:
            return qs.first(), False
        elif qs.count() > 1:
            return qs.order_by('timestamp').first(), False
        else:
            Klass = user.__class__
            user2 = Klass.objects.get(username=other_username)
            if user != user2:
                obj = self.model(
                        first=user, 
                        second=user2
                    )
                obj.save()
                return obj, True
            return None, False

Представление использует метод в вышеприведенном менеджере, например, так:

def get_object(self):
        other_username  = self.kwargs.get("username")
        print(other_username)
        print(self.request.user)
        obj, created = Thread.objects.get_or_new(self.request.user, other_username)
        if obj == None:
            raise Http404
        return obj

Если вы заметили в ThreadManager, get_or_new возвращает «none, false», если имя пользователя в URL и зарегистрированный пользователь совпадают. Тогда как он может открыться в браузере? Возможно, я упускаю очень простой или глупый вопрос, но, пожалуйста, помогите, я какое-то время ломал голову над этим.

...