문제

쿼리 세트의 열거를 2로 렌더링하는 좋은 방법이 있습니까? div 열?

960 그리드를 사용하여 ...

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

Django에서는 한 모델이 두 열에서 열거 된 내용을 두 열에 렌더링하고 바람직하게는 다소 동일하게 사용해야합니다. 현재, 나는 뷰에서 쿼리 세트를 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 스 니펫은 a 분할 템플릿 필터, 당신은 다음과 같이 사용할 수 있습니다.

{% 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>

다른 팁

  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로 전환했는데 이제 "열악한 Django 태그 및 필터를 사용하여 X를 표시하는 방법"이라는 문제가 없습니다.

나는 당신이 쿼리에 분할을 위해 나만의 템플릿 태그를 만들어야한다고 생각합니다. 나는 같은 일을 할 것이다.

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