Шаблон Django для цикла (печать ограниченных данных с использованием цикла) - PullRequest
2 голосов
/ 04 декабря 2011

Предположим, у меня есть 100 фильмы. с помощью цикла for. Мы можем напечатать все фильмы. Как ниже.

В шаблоне Django

{% for movie in movies.object_list %}

    {% endfor %}

Но что мне делать, если мне нужно распечатать только 1 25 50 75 100 фильм из списка? спасибо

ОБНОВЛЕНИЕ: Я написал это. Есть ли другая альтернатива?

{% for movie in movies.object_list %}
        {% if forloop.counter == 25 %}

            {{ movie }}

        {% endif %}

        {% if forloop.counter == 50 %}

            {{ movie }}

        {% endif %}
        {% if forloop.counter == 75 %}

            {{ movie }}

        {% endif %}
        {% if forloop.counter == 100 %}

            {{ movie }}

        {% endif %}
    {% endfor %}

View

def movie_sort(request):
categories = Category.objects.all()
language_name = Category.objects.get(id=request.GET.get('language'))
movie_l = Movie.objects.filter(language=request.GET.get('language'),is_active=True)
   # Displaying first row 
for i, v in enumerate(movie_l):
   if i == 0:
       first_row_f = v
   if i == 24:
       first_row_l = v
   if i == 25:
       second_row_f = v
   if i == 49:
       second_row_l = v
   if i == 50:
       third_row_f = v
   if i == 74:
       third_row_l = v
   if i == 75:
       fourth_row_f = v
   if i == 99:
       fourth_row_l = v
################
paginator = Paginator(movie_l, 100) # Show 25 contacts per page

page = request.GET.get('page',1)
try:
    movies = paginator.page(page)
except PageNotAnInteger:
    movies = paginator.page(1)
except EmptyPage:
    movies = paginator.page(paginator.num_pages)
return render_to_response('movie/alphabetic_list.html',locals(),
                          context_instance=RequestContext(request))

ОБНОВЛЕНИЕ2: Я написал следующую функцию в view. Единственная проблема с этим, если пользователь нажимает на следующую страницу (paginator), где отображаются предыдущие данные. Значит эти данные не меняются. любой совет?

  for i, v in enumerate(movie):
   if i == 0:
       first_row_f = v
   if i == 24:
       first_row_l = v
   if i == 25:
       second_row_f = v
   if i == 49:
       second_row_l = v
   if i == 50:
       third_row_f = v
   if i == 74:
       third_row_l = v
   if i == 75:
       fourth_row_f = v
   if i == 99:
       fourth_row_l = v

Ответы [ 4 ]

2 голосов
/ 04 декабря 2011

Если вы просто хотите, чтобы каждый 25-й элемент был близок к @Gautam K:

{% for movie in movies.object_list|slice:"::25" %}
    {{ movie }}
{% endfor %}

Приведенное выше решение включает пропущенное двоеточие после среза и работает для любого списка размеров (решение Гаутама работает только для 100список предметов).

1 голос
/ 04 декабря 2011

Два основных способа сделать это

  1. нумерация страниц
  2. MultipleObjectMixin автоматизирует все (и использует тот же нумерация страниц )

РЕДАКТИРОВАТЬ - вот пример использования пагинатора.

Опция # 1

Во-первых, измените ваши views.py:

from django.core.paginator import Paginator, EmptyPage, PageNotInteger
from myapp.models import Movie

def movies(request):
    movie_list = Movie.objects.all()
    pg = Paginator(movie_list, 50) # Show 50 items per page
    current_page = request.GET.page('page')
    try:
      movies = pg.page(page) # Grab the page from the URL, like /?page=2
    except PageNotAnInteger:
      movies = pg.page(1) # Start from page 1 if no page was passed
    except EmptyPage:
      movies = pg.page(pg.num_pages) # If invalid number pages; show last page

    # You pass the paginator object, not the queryset
    return render_to_response('mytemplate.html',{'movies':movies})

Далее настройте шаблон:

{% for movie in movies %}
   {{ movie }}
{% endfor %}

{% if movies.has_previous %}
<a href="?page={{ movies.previous_page_number }}">go back</a>
{% endif %}

You are on page {{ movies.number }} of {{ movies.paginator.num_pages }}

{% if movies.has_next %}
<a href="?page={{ movies.next_page_number }}">go forward</a>
{% endif %}
0 голосов
/ 05 декабря 2011

Вы должны включить enumerate(movie.object_list)

    for i, v in enumerate(movie.object_list):
   if i == 0:
       first_row_f = v
   if i == 24:
       first_row_l = v
   if i == 25:
       second_row_f = v
   if i == 49:
       second_row_l = v
   if i == 50:
       third_row_f = v
   if i == 74:
       third_row_l = v
   if i == 75:
       fourth_row_f = v
   if i == 99:
       fourth_row_l = v
0 голосов
/ 04 декабря 2011

Попробуйте нарезать список, используя django slice

Например попробуйте сделать

Редактировать в соответствии с предложением @ JeremyLewis

{% for movie in movies.object_list|slice "::25" %}
  {{ movie }}
{% endfor  %}

вместо операторов if

Я не проверял код, чтобы он мог работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...