2017-02-02 75 views
0

我正在創建用戶之間的私人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

的DATAS但不是

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

爲什麼會這樣?我怎樣才能顯示所有有關房間的數據?

------ UPDATE ------

我試圖解決的問題是,我想從返回值循環到我的模板。我只是不明白爲什麼它只顯示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) 
    ... 
+0

什麼是你正在試圖解決這個問題?你的代碼恐怕不是很清楚,遍歷所有的房間,然後對每個房間做進一步的查詢將會把你的數據庫帶到膝蓋處http://meta.stackexchange.com/questions/66377/what- is-the-xy-problem – e4c5

+0

@ e4c5感謝您的提示,我更新了並將嘗試使下一篇文章更加清晰,我只想通過'for'循環將多個對象呈現到我的模板中,當我嘗試時像上面的示例代碼那樣做它只是呈現'for'循環的最後一個對象。 – Lindow

+3

您在for循環的每次迭代中都重新定義'rooms',因此它只能包含上次迭代的結果。您可能需要將它們附加到列表中。 –

回答

0

感謝丹尼爾·羅斯曼的評論,誰建議我將結果追加到列表中我可以解決此問題。

這是我如何做的:

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 %} 
0

看着你views.py碼流,它只會傳遞的for循環的最後一次迭代的房間對象放入您的模板中。我建議通過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 %} 
相關問題