Django текущий request.user в методе модели - PullRequest
0 голосов
/ 01 октября 2019

Я работаю над простым приложением чата, в котором могут участвовать два пользователя. На основании request.user я пытаюсь переключить, кто из двух других пользователей зависит от того, кто вошел в систему. Дело в том, что в шаблоне я чувствую себя обязанным использовать chat.other_user, который, насколько мне известно, может быть добавлен толькокак свойство модели.

Теперь я знаю, что это анти-шаблон, модель не должна содержать специфичные для запроса свойства. Я просто не знаю, как еще это решить .. Я рассмотрел context_processors, template_tags, ремоделирование. Одно из найденных решений - использовать промежуточное ПО для хранения request.user в переменной, но мне это не подходит. Следующий код не будет работать, но дает представление о том, что я пытаюсь сделать:

class Chat(models.Model):
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name='+', on_delete=models.PROTECT)
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name='+', on_delete=models.PROTECT)
    start_time = models.DateTimeField(auto_now=True)

    def other_user(self, request):
        if request.user == self.user1:
            return self.user2
        elif request.user == self.user2:
            return self.user1
{% for chat in chat_list %}
  <p>Chat with: {{ chat.other_user.username }}</p>
{% endfor %}

Я пытался заставить его работать с представлениями на основе классов, но я не видел пути, поэтому я закончилделаем следующее. Тем не менее, это выглядит странно, и я пытаюсь найти решение, которое можно использовать повторно для нескольких представлений.

def other_user(chat_object, request):
    if request.user == chat_object.user1:
        return chat_object.user2
    elif request.user == chat_object.user2:
        return chat_object.user1

def chat_list(request):
    chats = Chat.objects.filter(id__in=Message.objects.values('chat'))

    for chat in chats:
        chat.other_user = other_user(chat, request)

    return render(request, 'website/chat_list.html', {'chat_list': chats})

Существует ли более простой способ работы с экземпляром модели чата в шаблоне, которыйесть «ярлык», чтобы узнать, кто из них другой пользователь?

...