2017-02-02 17 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

の公表件のデータはありませんので、

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

なぜ?どのように関係する部屋のすべてのデータを表示できますか?

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

私が解決しようとしている問題は、私は私のテンプレートにするループからの戻り値を欲しいということです。私はちょうど1つの結果しか表示されていないと私のテンプレートのすべてのforループされた結果を表示している理由は理解できませんか?は少し明確にそれを助けるかもしれない

models.py:あなたのviews.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

おかげで、私を提案:

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

次に、あなたのテンプレートで、ネストされたforループを構築したいと思います私はこの問題を解決できるリストに結果を追加する。ここで

は、私はそれをやった方法です:

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

を、それだけで部屋を渡すために起こっているのは、のために、ループの最後の反復上のオブジェクトあなたのテンプレートに。私の代わりに辞書にroom_userを渡すことをお勧め:ダニエル・ローズマンさんのコメントに

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