2009-04-14 4 views
9

나는 악명 높은 "페이지 매김"기술을 사용하는 장고 응용 프로그램을 현재 개발 중입니다. 나는 django.core.paginator 모듈이 어떻게 작동하는지 알아 내려고하고있다.장고 페이지 매김과 "현재 페이지"

질문 모델이있는 응용 프로그램이 있습니다. 이 paginator를 사용하여 모든 질문을 나열 할 것입니다. 페이지 당 20 개의 질문이 있습니다.

"... 2, 3, 4, 5, 6, ..."어떻게 든 현재 페이지를 강조 원하는대로 내가 많은 페이지처럼 다른 페이지를 목록보기에서
def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    page  = ... # Somehow figure out which page the question is on 
    return render_to_response('show_question.html', { 'page' : page }) 

, 해야 할 것. 내가 알고 싶은 두 가지가 정말있다

:

  1. 어떻게 장고는 질문에 위치한 페이지를 알아낼 어떻게해야합니까?
  2. 현재 서식있는 페이지를 제대로 "강조 표시"하려면 어떻게해야합니까?

편집 : 죄송합니다.이 질문의 일부를 잊어 버렸습니다. 또한 현재 페이지를 제외한 모든 페이지가 /questions/{{ that_page.start_index }}에 대한 링크가되고 싶습니다. 기본적으로 모든 페이지 링크는 해당 페이지의 첫 번째 질문에 연결됩니다.

+0

의 경우 당신은 무엇을 현재 제외한 모든 페이지는 해당 페이지의 질문에 연결할 의미합니까? 사용자가 페이지를 어떻게 변경합니까? –

+0

? page = 4 GET 요청 매개 변수 또는 아무것도 전달하고 싶지 않습니다. 4 번 질문에 대해서만/question/4를 사용하고, 그러면 그 질문이 어느 페이지에 있는지 파악할 것입니다. 이것이 바로 페이지 링크가 실제로 질문에 연결되는 이유입니다. –

+0

더 많은 질문이 추가되거나 정렬 될 수 있으므로 페이지 변경에 대한 첫 번째 질문을하지 않으시겠습니까? REST/HTTP 관점에서 볼 때 이는 URL이 실제 자원을 참조하지 않는다는 것을 의미합니다. 이것이 장고가 GET 매개 변수를 사용하는 이유입니다. URL이 식별하는 자원의 표시 특성에 주석을 달아주는 것입니다. –

답변

7

음 ... 나는 당신의 의견에서 당신이 django.core.paginator가 사용하기 위해 작성된 ol 'GET 매개 변수를 원하지 않는다는 것을 알 수 있습니다. 당신이 원하는 것을하기 위해, 나는 각 질문이있는 페이지를 사전 계산하는 것보다 더 좋은 방법을 생각할 수 없다. 예를 들어,보기 같은 존재 일 종료됩니다 :

ITEMS_PER_PAGE = 20 
def show_question(question_pk): 
    questions = Question.objects.all() 
    for index, question in enumerate(questions): 
     question.page = ((index - 1)/ITEMS_PER_PAGE) + 1 
    paginator = Paginator(questions, ITEMS_PER_PAGE) 
    page = paginator.page(questions.get(pk=question_pk).page) 
    return render_to_response('show_question.html', { 'page' : page }) 

, 당신은 항목에 관해서는

{% for i in page.paginator.page_range %} 
    {% ifequal i page.number %} 
     <!-- Do something special for this page --> 
    {% else %} 
     <!-- All the other pages --> 
    {% endifequal %} 
{% endfor %} 

그런 짓을하려는 템플릿의 현재 페이지를 강조 표시를, 당신은거야 함께 작업 할 두 개의 서로 다른 object_lists가 있습니다.

page.object_list 

현재 페이지의 개체되며

page.paginator.object_list 

에 관계없이 페이지의 모든 개체가 될 것입니다. 이러한 각 항목에는 해당 페이지가 어느 페이지에 있는지 알려주는 "페이지"변수가 있습니다.

모두가 말했듯이, 당신이하는 일은 틀에 맞지 않는 것처럼 들립니다. 다시 생각해보고 싶을 수도 있습니다. 그러나 어느쪽으로 든 행운을 빈다.

+0

오, 이런! 'page.paginator.object_list [i] .page'는 아마도 내가 찾고있는 것과 같을 것입니다! 즉시 확인해 보겠습니다. 감사! –

5

django-pagination 당신이 원하는대로 할 수 있으며, 그냥 플러그인하여 사용할 수있는 예쁜 패키지로 포장되어 있습니다. 기본적으로 뷰에서 템플릿과 미들웨어로 코드를 이동합니다.

편집 : 편집을 보았습니다. {% autopaginate object_list %}을 사용하여 페이지의 현재 개체를 가져올 수 있습니다. 그러면 object_list이 주어진 페이지의 현재 개체로 바뀝니다. 당신은 그것을 반복 할 수 있고 당신이 처음을 원한다면 그것을리스트처럼 취급 할 수 있고 object_list[0]을 할 수 있어야합니다. 당신이 당신의 전망 이내에을 유지하려면

,이 같은 것을 할 수있는 : 템플릿 내에서

def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    return render_to_response('show_question.html', { 'page' : paginator }) 

을, 당신은 수행하여 당신에있어 현재 페이지에 액세스 할 수 있습니다

# Gives you the starting index for that page. 
# For example, 5 objects, and you're on the second page. 
# start_index will be 3. 
page.start_index 

# You can access the current page number with: 
# 1-based index 
page.number 

이렇게하면 필요한 모든 것을 할 수 있습니다. 몇 가지 좋은 예가 here입니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 그러나 장고 - 페이지 매김은 내장 된 페이지 매김보다 더 많은 작업을 수행하는 것이 아니라 코드의 로직을 템플릿과 미들웨어로 옮기는 것입니다. 그렇지? –

+0

기본적으로 그렇습니다. 페이지 조회 로그인을보기에 유지하려면 내 대답을 업데이트했습니다. –

10

버전 1.2의을 사용하면 순수 기본 페이지 매김 태그를 사용하여이 작업을 완료 할 수 있습니다.

{% for page in article_list.paginator.page_range %} 
    {% if page == article_list.number %} 
    {{ page }} 
    {% else %} 
    <a href="/page{{ page }}">{{ page }}</a> 
    {% endif %} 
{% endfor %} 

article_list가 어디

paginator = Paginator(article_list, 20) 
    try: 
     article_list = paginator.page(int(page)) 
    except (EmptyPage, InvalidPage): 
     article_list = paginator.page(paginator.num_pages) 
+0

+1 멋진 ... 페이지 매김과 같은 stackoverflow를 작성할 수 있습니까 (예 :'prev 1 ... 7 8 9 10 11 ... 500435 next'). 나는'... '을 의미합니다. – suhailvs

+0

@suhail, 가능합니다. [django template syntax] (https://docs.djangoproject.com/en/dev/ref/templates/builtins)를 사용하여 템플릿을 수정하면됩니다. /). 하지만 차라리 당신은 [django-endless-pagination] (http://django-endless-pagination.readthedocs.org/en/latest/) 앱을 사용해 보길 권합니다. 설정하기 쉽고 모든 종류의 페이지 매김 스타일에 정상적인 기본값을 가지고 있습니다. –

관련 문제