जवाबों:
मुझे लगता है कि आप पारंपरिक फ़ंक्शन आधारित विचारों के साथ, नए वर्ग आधारित विचारों के साथ पृष्ठांकन का उपयोग करने के बारे में जानकारी मांगते हैं, यह खोजना आसान है। मैंने पाया कि सिर्फ 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=n
URL में जोड़कर ।
मान लें, मेरे पास ऐप में एक वर्ग है / मॉडल का नाम 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'),
),
... ]
context = super(SoalListView, self)...
:। क्या आपका मतलब था context = super(FileExamListView, self)...
:?
हमारे पास ऐसा करने के 2 तरीके हैं।
पहले एक सरल है और बस कक्षा क्षेत्र निर्धारित किया है paginate_by
। get_context_data
विधि के साथ हमें कुछ भी करने की आवश्यकता नहीं है ।
दूसरी विधि थोड़ी जटिल है, लेकिन हम पेजेशन के बारे में अधिक समझ हासिल कर सकते हैं और जटिल पेजिनेशन या कई पेजिनेशन को कस्टमाइज़ कर सकते हैं। चलिये देखते हैं।
इसे तीन चरणों में किया जा सकता है।
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
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 %}
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 %}