операторы » для «должны использовать формат» для x в y»: для всех сообщений в allPost1 и allPost2, allPost3 и allPost4

#django #django-views #django-templates

Вопрос:

У меня так много ключей в парах, и я хочу отобразить их в шаблоне, а затем я получил сообщение об ошибке, что for операторы должны использовать формат for x in y : for allPosts in allPost1 and allPost2 and allPost3 and allPost4

 <!--My html template-->
{% for allPosts in allPost1 and allPost2 and allPost3 and allPost4 %}
....
{% endfor %}

<!--My views template-->
def search1(request):
  ....
  params = {'allPost1': allpost1,'allPost2': allpost2,'allPost3': allpost3,'allPost4': allpost4, 'query': query}
      return render(request, "home/search1.html", params) 

Комментарии:

1. Вы не можете использовать and для цепочки списков/запросов «allPostx», вместо этого вы можете использовать цепочку |add фильтров docs.djangoproject.com/en/3.2/ref/templates/builtins/#add . Можете ли вы поделиться своим мнением, нужно ли вам создавать 4 разных списка сообщений или вы можете объединить их в один, по вашему мнению?

Ответ №1:

Вы должны связать итеративные объекты в цепочку в своем представлении. Представление реализует бизнес-логику, шаблон-только логику визуализации.

Таким образом, мы можем реализовать это с помощью:

 from itertools import chain

def search1(request):
    # …
    context = {
        'allPost1': allpost1,
        'allPost2': allpost2,
        'allPost3': allpost3,
        'allPost4': allpost4,
        'allPosts': chain(allpost1, allpost2, allpost3, allpost4)
        'query': query
    }
    return render(request, 'home/search1.html', context) 

затем мы визуализируем это с помощью:

 {% for post in allPosts %}
    …
{% endfor %} 

Также довольно странно, что в представлении у вас есть четыре итерации. Обычно вы можете «объединить» итеративные объекты, чтобы получить записи с помощью одного запроса.