Как выполнить итерацию по двум элементам в модели и отобразить на сайте с помощью Django?

У меня есть models.py со следующими полями:

class ChatStream(models.Model):
    bot = models.TextField()
    user = models.TextField()
    name = models.CharField(max_length=100, null=True)
    created_date = models.DateTimeField(auto_now_add=True)

И я хотел бы на сайте перебирать "бота" и "пользователя" по одному за раз, так что сайт гипотетически отображал бы что-то вроде:

bot: привет!
пользователь: как дела?
бот: Все хорошо
пользователь: Как тебя зовут
бот: бот - мое имя

.... и т.д. это будет продолжаться... Итак, в моем views.py у меня есть

def displayDict(request):
    m = ChatStream.objects.all()
    return render(request, 'chatStream.html',
    {"chat": m})
 

def send(request):
    message = request.POST.get('userMessage', False)
    ip = visitor_ip_address(request)
    response = routes(message, ip)
    print(ip, "user sent:", message, "bot response:", response)
    chatItem = ChatStream(bot=response, user=message, name=ip)
    chatItem.save()
    return HttpResponseRedirect('/chat/') 

Затем в моем шаблоне chat.html у меня есть

{% block chatStream %} {% endblock %}

And chatStream.html (именно здесь и происходит ошибка, я полагаю... как перебрать два элемента в модели, чтобы они появились один за другим в html-файле?)

>
{% extends 'chat.html' %}

{% block chatStream %}
{% for a in bot%}
{% for b in user%}
    <p>
        <b>bot:</b> {{a}} <br>
        <b>user:</b> {{b}} <br>
    </p>
{% endfor %}

<form action="/send/" method = "post">{% csrf_token %}
    <input type="text" name="userMessage">
    <input type="submit" value="Send to smallest_steps bot">
</form> 

{% endblock  %}

Но это не работает - текст из модели не отображается на сайте. Я не понимаю, как внутри chatStream.html

перебирать сразу два элемента в модели.

спасибо

Здесь много всего происходит, давайте попробуем разложить это по полочкам:

Во-первых, вам нужно передать контекстные переменные вашим шаблонам, если вы хотите визуализировать их с помощью (jinja-подобной) системы визуализации шаблонов Django.

Ваша функция представления для рендеринга шаблона будет выглядеть следующим образом:

views.py

def render_chat_page(request):

    # do some logic:
    ...

    # pack the context variables:
    context = {
        'some_key' : 'some_value',
        'chat_streams' : ChatStream.objects.all(),
        ...
    }

    return render(request, 'chat_page.html', context=context)

Ок, теперь, когда мы передали контекстные переменные в шаблон, мы можем выводить html-элементы, используя переменные, следующим образом:

template.html

<div> The value of "some_key" is: {{some_key}} </div>

{% for chat_stream in chat_streams %}
<div> user says: {{chat_stream.user}}</div>
<div> bot says: {{chat_stream.bot}}</div>
{% endfor %}

Это отобразит сообщения пользователя и бота для каждого объекта ChatStream. Однако мне кажется, что это не совсем то, что вам нужно, вместо этого вы можете захотеть что-то более динамичное.

В вашем представлении displayDict вы передаете QuerySet в контекст. Таким образом, вам нужно выполнить цикл по QuerySet в вашем шаблоне.

{% extends 'chat.html' %}

{% block chatStream %}
{% for item in chat %}
    <p>
        <b>bot:</b> {{item.bot}} <br>
        <b>user:</b> {{item.user}} <br>
    </p>
{% endfor %}

<form action="/send/" method = "post">{% csrf_token %}
    <input type="text" name="userMessage">
    <input type="submit" value="Send to smallest_steps bot">
</form> 

{% endblock  %}
Вернуться на верх