Шаблоны Django: объекты Группы в Тройках

Ваши входные данные нуждаются в атрибуте имени.


https://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_serialize

5
задан Oni 10 May 2009 в 12:15
поделиться

5 ответов

Всякий раз, когда вы пробуете сложный код внутри шаблонов, обычно это хороший признак того, что его следует перенести в другое место. Одно из альтернативных решений уже было предложено, а именно переместить код в вашу функцию просмотра.

Другим решением было бы раскрыть функциональность с помощью нового тега шаблона. Одна из причин, по которой вы предпочли бы это решение представлению, заключается в том, что вы сможете легко повторно использовать код для страниц, обслуживаемых с разными представлениями.

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 %}
5
ответ дан 18 December 2019 в 07:10
поделиться

Юваль находится на правильных строках, но похоже, что вы хотите дважды просмотреть список картин: один раз для отображения имен (по три в строке) и один раз для описания. Этого совсем не просто достичь с помощью языка шаблонов.

Я бы посоветовал посмотреть, сможете ли вы что-нибудь сделать с помощью некоторого 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 %}
3
ответ дан 18 December 2019 в 07:10
поделиться

Как насчет этих строк:

{% for p in paintingss %}
    <div class="painting">whatever</div>
    {% if forloop.counter|divisibleby:"3" %}
        <br>
    {% endif %}
{% endfor %}

Будет ли это вам полезно?

5
ответ дан 18 December 2019 в 07:10
поделиться

Я определенно голосую за создание структуры в вашем представлении и передачу ее в ваш шаблон в правильной форме.

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

2
ответ дан 18 December 2019 в 07:10
поделиться
{% 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-му объекту в объекте список.

0
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: