मैं Django वर्ग आधारित जेनेरिक ListViews के साथ पृष्ठांकन का उपयोग कैसे करूं?


182

मैं Django 1.3 के साथ पृष्ठांकन का उपयोग कैसे करूं?

इस पर प्रलेखन बहुत स्पष्ट नहीं है।

  • मेरा क्या जाता है views.py?

  • मेरे टेम्प्लेट में क्या जाता है?

  • मेरी URLconf फ़ाइल में क्या जाता है?

जवाबों:


338

मुझे लगता है कि आप पारंपरिक फ़ंक्शन आधारित विचारों के साथ, नए वर्ग आधारित विचारों के साथ पृष्ठांकन का उपयोग करने के बारे में जानकारी मांगते हैं, यह खोजना आसान है। मैंने पाया कि सिर्फ paginate_byचर सेट करके पेजिनेशन को सक्रिय करने के लिए पर्याप्त है। कक्षा-आधारित सामान्य विचारों में देखें ।

उदाहरण के लिए, आपके views.py:

import models
from django.views.generic import ListView

class CarListView(ListView):
    model = models.Car      # shorthand for setting queryset = models.Car.objects.all()
    template_name = 'app/car_list.html'  # optional (the default is app_name/modelNameInLowerCase_list.html; which will look into your templates folder for that path and file)
    context_object_name = "car_list"    #default is object_list as well as model's_verbose_name_list and/or model's_verbose_name_plural_list, if defined in the model's inner Meta class
    paginate_by = 10  #and that's it !!

अपने टेम्पलेट (में car_list.html), तो आप इस तरह एक पृष्ठांकन धारा (: हम कुछ संदर्भ चर उपलब्ध शामिल कर सकते हैं is_paginated, page_objऔर paginator)।

{# .... **Normal content list, maybe a table** .... #}
{% if car_list %}
    <table id="cars">
        {% for car in car_list %}
            <tr>
                <td>{{ car.model }}</td>
                <td>{{ car.year }}</td>
                <td><a href="/car/{{ car.id }}/" class="see_detail">detail</a></td>
            </tr>
        {% endfor %}
    </table>
    {# .... **Now the pagination section** .... #}
    {% if is_paginated %}
        <div class="pagination">
            <span class="page-links">
                {% if page_obj.has_previous %}
                    <a href="/cars?page={{ page_obj.previous_page_number }}">previous</a>
                {% endif %}
                <span class="page-current">
                    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                </span>
                {% if page_obj.has_next %}
                    <a href="/cars?page={{ page_obj.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>
    {% endif %}
{% else %}
    <h3>My Cars</h3>
    <p>No cars found!!! :(</p>
{% endif %}
{# .... **More content, footer, etc.** .... #}

प्रदर्शित करने के लिए पृष्ठ एक जीईटी पैरामीटर द्वारा इंगित किया जाता है, बस ?page=nURL में जोड़कर ।


1
यह ठीक है, लेकिन आप "कार_लिस्ट" ऑब्जेक्ट को भी कैसे देखते हैं?
गत

28
FYI करें आप इसे सीधे urls.py:url(r'^cars/$ ', ListView.as_view (मॉडल = कार,
पेजिनेट_बी

सबक मैंने सीखा: एक विधि खोजने के लिए, नए टैब में सभी पूर्वजों की कक्षाएं खोलें और कुंजी शब्द को CTRL + F दूर करें। इसलिए docs.djangoproject.com/en/dev/ref/class-based-views/… , जिसे हम मूल ट्यूटोरियल से जानते हैं, सभी पूर्वजों के लिंक खोलते हैं और "पागी" की खोज करते हैं
Ciro Santilli 郝海东 冠状 j j j ।

2
मैं यह कर रहा हूं, लेकिन मुझे जो समस्या मिलती है, वह यह है कि जब मैं क्वेरीसेट में वस्तुओं पर अतिरिक्त प्रसंस्करण करता हूं, तो यह उन्हें डेटाबेस के सभी परिणामों पर लागू करता है। तो एक क्वेरी के लिए जो 100 वस्तुओं को लौटाता है, लेकिन प्रति पृष्ठ केवल दस वस्तुओं को दिखाता है, 100 वस्तुओं पर अतिरिक्त प्रसंस्करण किया जाएगा।
wobbily_col

32
मुझे आपके द्वारा इसे हार्डककोड किए गए url पसंद नहीं हैं: <a href="?page=look जटिलताओं पृष्ठ_obj.prepret_page_number }"> पिछले </a>
dalore

42

मान लें, मेरे पास ऐप में एक वर्ग है / मॉडल का नाम FileExam(models.Model):

एप्लिकेशन / models.py

class FileExam(models.Model):
    myfile = models.FileField(upload_to='documents/%Y/%m/%d')
    date = models.DateTimeField(auto_now_add=True, blank=True)
    teacher_name = models.CharField(max_length=30)
    status = models.BooleanField(blank=True, default=False)

एप्लिकेशन / views.py

from app.models import FileExam
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger

class FileExamListView(ListView):
    model = FileExam
    template_name = "app/exam_list.html"
    paginate_by = 10


    def get_context_data(self, **kwargs):
        context = super(SoalListView, self).get_context_data(**kwargs) 
        list_exam = FileExam.objects.all()
        paginator = Paginator(list_exam, self.paginate_by)

        page = self.request.GET.get('page')

        try:
            file_exams = paginator.page(page)
        except PageNotAnInteger:
            file_exams = paginator.page(1)
        except EmptyPage:
            file_exams = paginator.page(paginator.num_pages)

        context['list_exams'] = file_exams
        return context

यहाँget_context_data django प्रलेखन से केवल एक छोटा सा परिवर्तन और जोड़ा पृष्ठांकन कोड

एप्लिकेशन / टेम्पलेट्स / अनुप्रयोग / exam_list.html

सामान्य सामग्री सूची

<table id="exam">
  {% for exam in list_exams %}
  <tr>
    <td>{{ exam.myfile }}</td>
    <td>{{ exam.date }}</td>
    <td>.....</td>
  </tr>
  {% endfor %}
</table>

पृष्ठभाग खंड

{% if is_paginated %}
<ul class="pagination">
{% if page_obj.has_previous %}
    <li>
        <span><a href="?page={{ page_obj.previous_page_number }}">Previous</a></span>
    </li>
{% endif %}
    <li class="">
        <span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
    </li>
{% if page_obj.has_next %}
    <li>
        <span><a href="?page={{ page_obj.next_page_number }}">Next</a></span>
    </li>
{% endif %}
</ul>
{% else %}
    <h3>Your File Exam</h3>
    <p>File not yet available</p>
{% endif %}

एप्लिकेशन / urls.py

urlpatterns = [
url(
    r'^$', views.FileExamListView.as_view(), name='file-exam-view'),
), 
... ]

1
यह सही नहीं लगता है context = super(SoalListView, self)...:। क्या आपका मतलब था context = super(FileExamListView, self)...:?
सीजर

1

हमारे पास ऐसा करने के 2 तरीके हैं।

पहले एक सरल है और बस कक्षा क्षेत्र निर्धारित किया है paginate_byget_context_dataविधि के साथ हमें कुछ भी करने की आवश्यकता नहीं है ।

दूसरी विधि थोड़ी जटिल है, लेकिन हम पेजेशन के बारे में अधिक समझ हासिल कर सकते हैं और जटिल पेजिनेशन या कई पेजिनेशन को कस्टमाइज़ कर सकते हैं। चलिये देखते हैं।

इसे तीन चरणों में किया जा सकता है।

1.Override get_context_dataविधि की अपनी View

पास करें page_keysऔर pagesताकि हम सूचियों को पुनरावृत्त कर सकें और हार्ड-कोडिंग से बच सकें।

def get_context_data(self, *, object_list=None, **kwargs):
    context = super().get_context_data()
    df = pd.DataFrame(list(self.model.objects.all().values()))
    ipc = df.groupby('ip')['ip'].count().sort_values(ascending=False)
    urlc = df.groupby('url')['url'].count().sort_values(ascending=False).to_dict()

    ipc = tuple(ipc.to_dict().items())
    urlc = tuple(urlc.items())

    pages = []
    page_keys = ['page1', 'page2']
    for obj, name in zip([urlc, ipc], page_keys):
        paginator = Paginator(obj, 20)
        page = self.request.GET.get(name)
        page_ipc = obj
        try:
            page_ipc = paginator.page(page)
        except PageNotAnInteger:
            page_ipc = paginator.page(1)
        except EmptyPage:
            page_ipc = paginator.page(paginator.num_pages)
        pages.append(page_ipc)

    context['data'] = zip(pages, page_keys)
    return context

2. अपने उप अनुकूलित करें template

हम कुछ चर को परिभाषित करते हैं ताकि हम पृष्ठांकन सूची के माध्यम से पुनरावृति कर सकें।

pagination.html

    {% if is_paginated %}
        <ul class="pagination">
        {% if page_obj.has_previous %}
            <li>
            <span><a href="?{{ pname }}={{ page_obj.previous_page_number }}">Previous</a></span>
            </li>
        {% endif %}
        <li class="">
            <span>Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.</span>
        </li>
        {% if page_obj.has_next %}
            <li>
            <span><a href="?{{ pname }}={{ page_obj.next_page_number }}">Next</a></span>
            </li>
        {% endif %}
        </ul>
    {% else %}
        <h3>Your File Exam</h3>
        <p>File not yet available</p>
    {% endif %}

3. अनुकूलित बाहरी है template

index.html

{% for foo,name in data %}
    <div class="col-md-3 table-responsive">

            {% for k,v in foo %}
                <tr>
                    <th>{{ forloop.counter }}</th>
                    <td>{{ k }}</td>
                    <td>{{ v }}</td>
                </tr>
            {% endfor %}

        {% include 'pagination.html' with pname=name  page_obj=foo %}
    </div>
{% endfor %}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.