문제

저는 현재 악명 높은 "Pagination"기술을 활용하는 Django 응용 프로그램을 개발하고 있습니다. Django.core.paginator 모듈이 어떻게 작동하는지 알아 내려고 노력하고 있습니다.

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

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 })

보기에서 다른 페이지를 "... 2, 3, 4, 5, 6, ... "많은 페이지처럼 현재 페이지를 강조하고 싶습니다.

내가 알고 싶은 두 가지가 있습니다.

  1. Django가 질문이 어떤 페이지에 있는지 알아 내도록하려면 어떻게해야합니까?
  2. 현재 방문중인 페이지를 올바르게 "강조"하기 위해 템플릿을 어떻게 작성합니까?

편집 : 죄송합니다.이 질문의 일부를 잊었습니다. 나는 또한 현재 페이지를 제외한 모든 페이지를 원한다. /questions/{{ that_page.start_index }}. 따라서 기본적으로 모든 페이지 링크는 해당 페이지의 첫 번째 질문에 연결됩니다.

도움이 되었습니까?

해결책

흠 ... 당신의 의견에서 당신은 ol 'get 매개 변수를하고 싶지 않다는 것을 알았습니다. 이것이 Django.core.paginator가 사용하기 위해 작성된 것입니다. 당신이 원하는 것을하기 위해, 나는 각 질문이 켜져있는 페이지를 사전에 계산하는 것보다 더 좋은 방법을 생각할 수 없습니다. 예를 들어, 당신의 견해는 다음과 같은 것입니다.

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

페이지에 관계없이 모든 개체가됩니다. 이러한 각 항목에는 "페이지"변수가있어 어떤 페이지에 있는지 알려줍니다.

그것은 당신이하고있는 일이 무의미한 것 같습니다. 당신은 다시 생각하고 싶을 수도 있지만, 어느 쪽이든 행운을 빕니다.

다른 팁

장고, 적어도 버전 1.2에서 Pure Default Pagination 템플릿 태그를 사용 하여이 작업을 완료 할 수 있습니다.

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

장고-지분 당신이 원하는 것을 수행하고 플러그인하고 사용할 수있는 예쁜 패키지로 포장해야합니다. 본질적으로 뷰에서 템플릿 및 미들웨어로 코드를 이동합니다.

편집 : 방금 편집을 보았습니다. 사용을 사용하여 현재 객체를 가져올 수 있습니다. {% 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

그것으로, 당신은 필요한 모든 것을 할 수 있어야합니다. 몇 가지 좋은 예가 있습니다 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top