Визуализировать один набор запросов в 2 столбца div (шаблон django)

StackOverflow https://stackoverflow.com/questions/1610178

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть ли хороший способ отобразить перечисление набора запросов в два столбца 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>
Это было полезно?

Решение

Я рекомендую использовать фильтры 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>

Другие советы

<Ол>
  • Это задача системы рендеринга, а не представления. Представление не должно знать, будете ли вы отображать 2, 3 или 4 столбца в шаблоне.
  • Всегда лучше использовать стандартные теги 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"

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

    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)
    

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

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

    <div class="row">
        {% for sport in sports %}
            <div class="col-md-6">
                <!-- Blah Blah -->
            </div>
        {% endfor %}
    </div>
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top