سؤال

أقوم حاليًا بتطوير تطبيق 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 }}.لذا فإن كل رابط صفحة سيرتبط بالسؤال الأول في تلك الصفحة.

هل كانت مفيدة؟

المحلول

همم...أرى من تعليقك أنك لا تريد استخدام معلمة GET ol، وهو ما تم كتابة 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 %}

أما بالنسبة للعناصر، سيكون لديك قائمتين مختلفتين من قوائم الكائنات للعمل بهما...

page.object_list

ستكون الكائنات الموجودة في الصفحة الحالية و

page.paginator.object_list

ستكون جميع الكائنات، بغض النظر عن الصفحة.سيكون لكل عنصر من هذه العناصر متغير "صفحة" يخبرك بالصفحة الموجودة فيه.

ومع ذلك، فإن ما تفعله يبدو غير تقليدي.قد ترغب في إعادة التفكير، ولكن في كلتا الحالتين، حظا سعيدا.

نصائح أخرى

جانغو, على الأقل من الإصدار 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)

django-ترقيم الصفحات يجب أن تفعل ما تريد ويأتي ملفوفًا في حزمة جميلة يمكنك فقط توصيلها واستخدامها.يقوم بشكل أساسي بنقل الكود من طرق العرض الخاصة بك إلى القوالب والبرمجيات الوسيطة.

يحرر:لقد رأيت للتو تعديلك.يمكنك الحصول على الكائنات الحالية على الصفحة باستخدام {% 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