Визуализировать один набор запросов в 2 столбца div (шаблон django) - PullRequest
15 голосов
/ 23 октября 2009

Есть ли хороший способ отобразить перечисление набора запросов в два div столбца?

Используя сетку 960, я получил кое-что с эффектом ...

<div class="container_16">
    <div class="grid_8 alpha"></div>
    <div class="grid_8 omega"></div>
</div>

В Django одна модель должна иметь свое перечисленное содержимое, отображаемое в обоих столбцах, и, желательно, несколько одинаково. На данный момент у меня есть некрасивый код, который в представлении разбивает QuerySet на 2 половины, а затем каждая половина отображается в соответствующем столбце.

Должен быть лучший способ сделать это, предпочтительно используя только систему рендеринга шаблонов?

Просто для справки, вот как это «работает» на данный момент:

views.py

@render_to('template.html')
def main_athletics_page(request, *args, **kwargs):    
    sports = Sport.objects.all()
    half = sports.count() / 2
    return { 'sports_1' : sports[0:half], 'sports_2' : sports[half:] }

template.html

<div class="grid_8 alpha">
    {% for sport in sports_1 %}
        <!-- Blah blah -->
    {% endfor %}
</div>

<div class="grid_8 omega">
    {% for sport in sports_2 %}
        <!-- Blah blah -->
    {% endfor %}
</div>

Ответы [ 4 ]

16 голосов
/ 23 октября 2009

Я рекомендую использовать Фильтры Django .

Фрагменты Django предоставляют фильтр шаблона разбиения , который вы можете использовать как:

{% load listutil %}

<div class="grid_8 alpha">
    {% for sport in sports|partition:"2"|first %}
        <!-- Blah Blah -->
    {% endfor %}
</div>

<div class="grid_8 omega">
    {% for sport in sports|partition:"2"|last %}
        <!-- Blah Blah -->
    {% endfor %}
</div>
5 голосов
/ 13 октября 2014
  1. Это задача системы рендеринга, а не просмотра. Представление не должно знать, будете ли вы отображать 2, 3 или 4 столбца в шаблоне.
  2. Всегда лучше использовать стандартные теги Django.

Использовать тег шаблона Django по умолчанию cycle:

<table>
    {% for item in items %}
        {% cycle 'row' '' as row silent %}
        {% if row %}<tr>{% endif %}
            <td>
                {{ item }}
            </td>
        {% if not row %}</tr>{% endif %}
    {% endfor %}
</table>

Он отобразит ваш список [1 2 3 4 5 6] как

1 2

3 4

5 6

Кстати, шаблонизатор Jinja2 имеет фильтры batch и slice, которые помогут. Я переключился на jinja2, и теперь у меня нет ни одной из тех проблем «как отображать x, используя плохие теги и фильтры django»

0 голосов
/ 25 апреля 2014

Вот быстрое решение, которое использует начальную загрузку и не требует фильтров Django

<div class="row">
    {% for sport in sports %}
        <div class="col-md-6">
            <!-- Blah Blah -->
        </div>
    {% endfor %}
</div>
0 голосов
/ 23 октября 2009

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

from django.template import Library, Node, TemplateSyntaxError
from restaurants.forms import MenuItemForm

class Split(Node):
    def __init__(self, queryset, split_count=2, basename=None):
        self.queryset_name = queryset
        self.split_count = split_count
        self.basename = basename if basename else queryset

    def render(self, context):
        qs = context[self.queryset_name]
        qs_break = len(qs)/self.split_count
        for x in xrange(0, self.split_count-1):
            context["%s_%i"%(self.basename, x+1)] = qs[qs_break*x:qs_break*(x+1)]
        context["%s_%i"%(self.basename, x+2)] = qs[qs_break*x+1:]
        return ''        



def split(parser, token):
    """
    Call from template will be
    {% split <queryset> on <count> as <name> %}
    """
    tokens = token.split_contents()
    if len(tokens) > 6:
        raise TemplateSyntaxError("Too many Tokens")
    #Do various tests to make sure it's right.
    return Split(tokens[1], tokens[3], tokens[5])

split = register.tag(split)

Обратите внимание, что я на самом деле не тестировал этот код, так что он может сработать эффектно, но он должен указать вам правильное направление, чтобы вывести этот материал из поля зрения.

...