Как выполнить итерацию по двум элементам в модели и отобразить на сайте с помощью 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 %}