Я работаю над простым приложением чата, в котором могут участвовать два пользователя. На основании 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})
Существует ли более простой способ работы с экземпляром модели чата в шаблоне, которыйесть «ярлык», чтобы узнать, кто из них другой пользователь?