在 django 模板中的另一个大括号内使用大括号

Posted

技术标签:

【中文标题】在 django 模板中的另一个大括号内使用大括号【英文标题】:using curly double brackets inside another curly double brackets in django template 【发布时间】:2021-08-21 00:17:47 【问题描述】:

几天前我开始学习 Django,在做一个项目时遇到了一个情况。 在views.py中,我通过了

def chat_rooms(request):
context = dict()
context['title'] = 'Chat'
rooms = Chat_rooms.objects.filter(Q(user1 = request.user.id) | Q(user2 = request.user.id) )
context['rooms'] = rooms
for room in rooms:
    rmssg = Chats.objects.filter(room_id = room.id)
    lmssg = Chats.objects.latest('id')
    context[str(room.id)] = lmssg
return render(request,'previlageGroup/chat_rooms.html',context)

在 Django 模板中,chat_room.html

% for room in rooms %
<div class="card" style="width: 100%;">
<a href="% url 'pgroup:chat.screen' room.id %">
    <div class="card-body">
        <p class="card-text">
             room.id.message
        </p>
    </div>
</a>
</div>
 % endfor %

在models.py中

class Chat_rooms(models.Model):
user1 = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user1')  
user2 = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user2')
created_on = models.DateTimeField(auto_now_add=True)

class Chats(models.Model):
date = models.DateTimeField(auto_now_add=True)
has_viewed = models.BooleanField(default= False) 
message = models.CharField(max_length = 200)
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')  
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='receiver')
room = models.ForeignKey(Chat_rooms, on_delete=models.CASCADE)

Django 给我一个错误, room.id.message 是不可能的。 我怎样才能做到这一点?还有其他方法吗?提前致谢

【问题讨论】:

【参考方案1】:

归根结底,django Model 对象就像 python 中的任何其他 object 一样,因此您可以轻松做到:

for room in rooms:
    rmssg = Chats.objects.filter(room_id = room.id)
    lmssg = Chats.objects.latest('id')
    room.last_msg = lmssg

并在您的模板中访问 room.last_msg 。但是,如果您碰巧实现了 last_msg 字段,这可能会导致错误。

也许更优雅的解决方案是在您的 room 字段中实现 related_name。如果您将views.py 的最后一行更改为:

room = models.ForeignKey(Chat_rooms, on_delete=models.CASCADE, related_name="chats")

您将能够执行以下操作:

room.chats.all() #get all messages from a chatroom

而且,在您的模板中,您可以这样做:

 room.chats.last 

获取聊天中的最后一条消息。

【讨论】:

以上是关于在 django 模板中的另一个大括号内使用大括号的主要内容,如果未能解决你的问题,请参考以下文章

Django的模板系统

Django框架模板详解

jmeter--正则提取json串中一个大括号对象里指定字段值的的另一个字段的值

Vue 和 Django mustache 模板冲突

注销后将 Django/Vue 大括号添加到请求方法

Django-常用模板标签及过滤器