2011-12-04 146 views
2

假設我有100電影。藉助for循環。我們可以打印所有的電影。如下所示。Django模板循環(打印限制數據使用for循環)

在Django的模板

{% for movie in movies.object_list %} 

    {% endfor %} 

可是我該怎麼辦如果我必須從列表中只打印1255075100電影?謝謝

更新:我寫了這個。有另外一種選擇嗎?

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

UPDATE2:香港專業教育學院的書面按照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 
+0

理想的情況下,這應該在視圖中完成,而不是模板。模板不應該包含複雜的邏輯 - 對此的最佳和最「pythonic」解決方案是創建要在視圖中打印的電影列表,並將其傳遞到模板,而不是整個電影列表。 – Ben

回答

0

你必須包括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

它工作。謝謝 – Kulbir

0

嘗試使用django slice

例如嘗試做

編輯由@JeremyLewis

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

代替if語句

我的避風港的建議切片列表不檢查代碼,以便它可以工作。

1

兩種基本的方法來做到這一點

  1. pagination
  2. MultipleObjectMixin自動化整個事情(和使用相同的pagination功能)

編輯 - 這裏是如何使用的例子paginator。

選項#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 %} 
2

如果你只是希望每一個第25條,@Gautamķ已關閉:

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

上述解決方案包括片段後缺少的冒號,可用於任何大小的列表(Gautam解決方案僅適用於100個項目列表)。