Шаблон Django, повторяющий набор запросов со счетчиком цикла for - PullRequest
0 голосов
/ 17 мая 2018

У меня есть 3 набора запросов для 3 различных типов статей: правая, центральная, левая.Я пытаюсь отобразить их в 3 столбцах, чтобы они выглядели так:

Right Lean |Центр Lean |Левый наклон

правый наклон |Центр Lean |Lean Lean

Right Lean |Центр Lean |Left Lean

Итак, у меня есть это в трех наборах запросов, как это в представлении:

right_articles = sline.article_set.filter(avgLean__lte=-0.75).order_by('-credibility')[:25]
left_articles = sline.article_set.filter(avgLean__gte=0.75).order_by('-credibility')[:25]
center_articles = sline.article_set.filter(avgLean__gt=-0.75).filter(avgLean__lt=0.75).order_by('-credibility')[:25]

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

return render(request, 'storylines/detail.html', {'n_articles': range(0, 24),
        'storyline': sline, 
        'reqUser':request.user, 
        'vote':ini, 'right_articles':right_articles, 
        'left_articles': left_articles, 
        'center_articles': center_articles})

Затем я перехожу к шаблону и перебираю такие, как этот:

<div class="row">
<div class= "col-4">
    Left articles: {{ left_articles.count }}
</div>
<div class= "col-4">
    Center articles: {{ center_articles.count }}
</div>
<div class= "col-4">
    Right articles: {{ right_articles.count }}
</div>
</div>
    {% for i in n_articles %}
   <div class="row">
        Trying {{ i }}<br>
        {% with left_articles.i as lt_article %}
            {% if lt_article %}
                {% show_card lt_article %}
            {% else %}
                <div class="col-4">No Left article {{ i }}</div>
            {% endif %}
        {% endwith %}

        {% with center_articles.i as cn_article %}
            {% if cn_article %}
                {% show_card cn_article %}
            {% else %}
                <div class="col-4">No Center article {{ i }}</div>
            {% endif %}
        {% endwith %}

        {% with right_articles.i as rt_article %}
            {% if rt_article %}
                {% show_card rt_article %}
            {% else %}
                <div class="col-4">No Right article {{ i }}</div>
            {% endif %}
        {% endwith %}
    </div>      
    {% endfor %}

Операторы count в первой строке показывают, что у меня действительно есть 1каждый слева / в центре / справа.Если я изменю свой код, чтобы заменить right_articles.i на right_articles.0, я получу статью.Строка с надписью Trying {{i}} показывает, что я начинаю с 0, поэтому right_articles.i должен возвращать статью, когда i = 0. Однако, к сожалению, я не получаю статей, что означает, что у меня что-то не так с синтаксисом

        {% with right_articles.i as rt_article %}

Может кто-нибудь сказать мне правильный способ сказать то, что я пытаюсь сказать здесь?

Спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Я не буду предлагать что-либо улучшить, пользовательский фильтр тегов сделает свое дело:

from django import template

register = template.Library()

@register.filter
def select_item(queryset,i):
    return queryset[i]
    # Be careful of IndexError: list index out of range

Так что теперь у вас будет доступ к элементу

{% with left_articles|select_item:i as lt_article %}
{% endwith %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...