我想在用户之间创建一个简单的聊天应用程序。这是代码的一部分:
Models.py:
class Chat(models.Model):
message = models.CharField(max_length=250)
sender = models.ForeignKey(User,related_name="sent",on_delete=models.CASCADE)
receiver = models.ForeignKey(User,related_name="received",on_delete=models.CASCADE)
timeStamp = models.DateTimeField(auto_now_add=True)
read = models.BooleanField(default=False)
Views.py:
def inbox(request):
sent_list = Chat.objects.filter(sender=request.user)
received_list = Chat.objects.filter(receiver=request.user)
inbox_list = sent_list | received_list
context={
'inbox_list':inbox_list
}
return render(request,'blog/inbox.html',context)
Inbox.html:
{%for message in inbox_list %}
{% if message.sender == request.user %}
<a href="{% url 'chat' message.receiver.id %}" >{{message.receiver.username}}</a>
{%else%}
<a href="{% url 'chat' message.sender.id %}" >{{message.sender.username}}</a>
{% endif%}
{% endfor%}
我在Inbox.html
中获得了聊天列表,但对于每条消息,相同的用户都会出现在列表中。如何仅在我发送和接收邮件后才过滤用户。另外,如果可以创建唯一的聊天室,那么任何建议都会有用。
答案 0 :(得分:0)
选项1:尝试使用distinct()Django doc
选项2:如果您试图创建结合两个模型的数据集,并且需要更多控制,为什么不根据需要创建列表/列表并在模板中进行渲染。
答案 1 :(得分:0)
这里有一个基本的替代解决方案,我为用户创建了一个列表,使用for循环遍历了所有消息,并为每个消息添加了发件人和收件人,并添加了if条件以防止重复。
Views.py:
def inbox(request):
sent=Chat.objects.filter(sender=request.user).distinct('receiver')
received=Chat.objects.filter(receiver=request.user).distinct('sender')
all= list(chain(sent, received))
users = []
for m in all:
if not m.sender in users and not m.sender == request.user:
users.append(m.sender)
if not m.receiver in users and not m.receiver == request.user:
users.append(m.receiver)
context={'users':users,}
return render(request,'blog/inbox.html',context)
Inbox.html:
<div class="container">
{%for user in users %}
<div>
<img style="width:50px;height:50px;"class="profile-photo" src="
{{user.profile.image.url}}"/>
<a href="{% url 'chat' user.username %}" >{{user.username}}</a>
</div></br>
{% endfor%}
</div>