如何从视图到模板的循环中渲染值?

时间:2017-02-02 12:03:03

标签: python django django-templates django-views

我正在创建用户之间私密的1对1聊天,我想显示上次发送的消息,问题是当我将每个房间的最后一条消息循环到我的模板时,它只向我显示一个数据并且有很多。

以下是我在 views.py:

中的内容
def my_rooms(request, username):
    user = User.objects.get(username=username)
    room_user = Room.objects.all()

    print('----------------------------------------')
    for room in room_user:
        rooms = room.messages.all()[:1]
        print(rooms)

    return render(request, "my_room.html", {
        'rooms': rooms,
    })

打印(会议室),(每篇文章都有自己的私人聊天室):

-------------------------------
[]
[<Message: 02-02-2017 09:50AM, user01 to user02 : hey>] #room1
[]
[<Message: 02-02-2017 10:52AM, user01 to user02 : Fine and you ?>] #room2

my_room.html

{% for room in rooms %}
    <p>{{ room.client }} : {{ room.message }}</p>
    <p>{{ room.timestamp }}</p>
{% endfor %}

我的模板会发生什么?

我得到:

[<Message: 02-02-2017 10:52AM, user01 to user02 : Fine and you ?>] #room2

发布的数据但不是

[<Message: 02-02-2017 09:50AM, user01 to user02 : hey>] #room1

为什么这样?如何显示所有相关房间的数据?

------更新------

我想解决的问题是我想从for循环返回值到我的模板。我只是不明白为什么它只在我的模板上显示1个结果而不是所有for循环结果?

models.py 可能有助于它更清晰:

class Room(models.Model):
    gig = models.ForeignKey(Gig, null=True)
    creator = models.ForeignKey(User)
    ...

class Message(models.Model):
    client = models.ForeignKey(User, related_name='client', null=True)
    seller = models.ForeignKey(User, related_name='seller', null=True)
    room = models.ForeignKey(Room, related_name='messages', null=True)
    message = models.TextField(max_length=500)
    timestamp = models.DateTimeField(default=timezone.now, db_index=True)
    ...

2 个答案:

答案 0 :(得分:0)

查看views.py代码的流程,它只会将for循环的最后一次迭代中的rooms对象传递到模板中。我建议将room_user传递给字典:

return render(request, "my_room.html", {
    'room_user': room_user,
}

然后,在您的模板中,您将要构建一个嵌套的for循环:

{% for room in room_user %}
    {% for rmessage in room.messages.all()[:1] %}
        <p>{{ rmessage.client }} : {{ rmessage.message }}</p>
        <p>{{ rmessage.timestamp }}</p>
    {% endfor %}
{% endfor %}

答案 1 :(得分:0)

感谢Daniel Roseman的评论,他建议我将结果附加到列表中,我可以解决这个问题。

我是这样做的:

<强> views.py

...
    room_user = Room.objects.all()
    my_rooms = []

    for room in room_user:
        rooms = room.messages.all()[:1]
        my_rooms.append(rooms)

return render(request, "my_room.html", {
    'rooms': my_rooms,
})

<强> my_room.html

{% for room in rooms %}
    {% for r in room %}
      <p>{{ r.client }} {{ r.message }}</p>
      <p>{{ r.timestamp }}</p>
    {% endfor %}
{% endfor %}