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

«s ДАННЫЕ опубликованы, но не

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

Почему так? Как я могу показать все данные о соответствующих комнатах?

------ ОБНОВЛЕНИЕ ------

Проблема, которую я пытаюсь решить, что я хотел бы возвращаемые значения из цикла в шаблон. Я просто не понимаю, почему он показывает только 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, поэтому он может содержать только результаты последней итерации. Вероятно, вам нужно добавить их в список. –

ответ

0

Благодаря комментарий Daniel Роземан в, который предложил мне чтобы добавить результаты в список, я мог бы решить эту проблему.

Вот как я это сделал:

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 кода, это только собирается передать номера объекта на последней итерации цикла для в ваш шаблон. Я хотел бы предложить прохождение 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 %} 
Смежные вопросы