Ваши входные данные нуждаются в атрибуте имени.
https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_serialize
Всякий раз, когда вы пробуете сложный код внутри шаблонов, обычно это хороший признак того, что его следует перенести в другое место. Одно из альтернативных решений уже было предложено, а именно переместить код в вашу функцию просмотра.
Другим решением было бы раскрыть функциональность с помощью нового тега шаблона. Одна из причин, по которой вы предпочли бы это решение представлению, заключается в том, что вы сможете легко повторно использовать код для страниц, обслуживаемых с разными представлениями.
class GroupPaintingsNode(template.Node):
def __init__(self, num, varname):
self.num, self.varname = int(num), varname
def render(self, context):
paintings = Painting.objects.all # do your fetching/filtering here..
l = [[] for i in range(len(paintings))]
i = 0
while i < len(paintings):
l[i].append([p.title for p in paintings[i:i+self.num]])
l[i].append([p.desc for p in paintings[i:i+self.num]])
i += self.num
context[self.varname] = l
return ''
def group_paintings(parser, token):
tokens = token.contents.split()
if len(tokens) != 4:
raise template.TemplateSyntaxError, "'%s' tag requires three arguments" % tokens[0]
if tokens[2] != 'as':
raise template.TemplateSyntaxError, "Second argument to '%s' tag must be 'as'" % tokens[0]
return GroupPaintingsNode(tokens[1], tokens[3])
group_paintings = register.tag(group_paintings)
В коде шаблона вы бы использовали его следующим образом:
{% group_paintings 3 as paintings %}
{% for p in paintings %}
{% for title in p.0 %} {{ title }} {% endfor %}<br>
{% for desc in p.1 %} {{ desc }} {% endfor %}
{% endfor %}
Юваль находится на правильных строках, но похоже, что вы хотите дважды просмотреть список картин: один раз для отображения имен (по три в строке) и один раз для описания. Этого совсем не просто достичь с помощью языка шаблонов.
Я бы посоветовал посмотреть, сможете ли вы что-нибудь сделать с помощью некоторого CSS. Должна быть возможность назначить класс для div с именем и / или описанием, чтобы все имена оставались вместе, а описания отображались в виде блоков внизу. Тем не менее, все еще сложно.
В качестве альтернативы вы можете предварительно обработать список в своем представлении, чтобы разделить имена и описания на группы по три. Вы хотите получить такую структуру:
[
[name1, name2, name3],
[description1, description2, description3],
[name4, name5, name6],
[description4, description5, description6],
...
]
Итак, вы можете попробовать сделать это:
painting_list = []
counter = 0
while counter < len(paintings):
painting_list.append([p.name for p in paintings[counter:counter+3])
painting_list.append([p.description for p in paintings[counter:counter+3])
counter += 3
, а затем в своем шаблоне:
{% for group in painting_list %}
<div class="names">{% for name in group.0 %}{{ name }} {% endfor %}</div>
<ul class="descriptions">
{% for description in group.1 %}
<li>{{ description }}</li>
{% endfor %}
</ul>
{% endfor %}
Как насчет этих строк:
{% for p in paintingss %}
<div class="painting">whatever</div>
{% if forloop.counter|divisibleby:"3" %}
<br>
{% endif %}
{% endfor %}
Будет ли это вам полезно?
Я определенно голосую за создание структуры в вашем представлении и передачу ее в ваш шаблон в правильной форме.
Если вы обнаружите, что боретесь с логикой шаблона, то это знак того, что вы должны быть делать больше работы на ваш взгляд. (это также научило меня, что часть моей логики представления должна быть возвращена в мои модели ...)
{% for painting in painting_list %}
<div class="painting">{{ painting }}</div>
{% if forloop.counter|divisibleby:"3" %}
<br>
{{ description_list.forloop.counter0-2 }}
{{ description_list.forloop.counter0-1 }}
{{ description_list.forloop.counter0 }}
{% endif %}
{% endfor %}
просто чтобы вы знали, что этот код не будет работать, но что-то вроде этого - то, что вы хотите.
Может быть, вы могли бы придумать свой собственный тег шаблона для доступа к n-му объекту в объекте список.