আমি কীভাবে জ্যাঙ্গো ক্লাস ভিত্তিক জেনেরিক তালিকাভিউগুলির সাথে পৃষ্ঠাগুলি ব্যবহার করব?


182

আমি জ্যাঙ্গো ১.৩ এর সাথে পৃষ্ঠাগুলি কীভাবে ব্যবহার করব?

ডকুমেন্টেশন এ সম্পর্কে খুব পরিষ্কার নয়।

  • আমার কি যায় views.py?

  • আমার টেম্পলেট কি যায়?

  • আমার ইউআরএলকনফ ফাইলটিতে কী যায়?

উত্তর:


338

আমি মনে করি যে আপনি নতুন শ্রেণিভিত্তিক মতামতগুলির সাথে পৃষ্ঠাগুলি ব্যবহার সম্পর্কে তথ্যের জন্য জিজ্ঞাসা করেছেন, traditionalতিহ্যগত ফাংশন ভিত্তিক মতামত সহ এটি সন্ধান করা সহজ। আমি দেখতে পেয়েছি যে কেবল 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ইউআরএল-এ যোগ করা ।


1
ঠিক আছে, তবে আপনি কীভাবে টেমপ্লেটটি বেঁধে রাখবেন "কার_লিস্ট" অবজেক্টটি?
গাৎ

28
এফওয়াইআই আপনি এটি সরাসরি urls.py:url(r'^cars/$ ', তালিকাভিউ.অ্যাস_ভিউ (মডেল = গাড়ি,
প্যাগিনেট_বি

পাঠ আমি শিখেছি: একটি পদ্ধতি খুঁজে বের করতে, সমস্ত পূর্বপুরুষের ক্লাসগুলিকে নতুন ট্যাবগুলিতে খুলুন এবং CTRL + F কী শব্দটি দূরে রাখুন। সুতরাং ডকস.ডজ্যাঙ্গোপ্রজেক্ট.com / en / dev / ref / class-based-views /… থেকে , যা আমরা জানি প্রাথমিক টিউটোরিয়াল থেকে বিদ্যমান, সমস্ত পূর্বপুরুষ লিঙ্কগুলি খুলুন এবং "
প্যাগি

2
আমি এটি করছি, তবে আমি যে সমস্যাটি পেয়েছি তা হ'ল আমি যখন ক্যোরিসেটের বস্তুগুলিতে অতিরিক্ত প্রসেসিং করি তখন এটি ডাটাবেসের সমস্ত ফলাফলের ক্ষেত্রে সেগুলি প্রয়োগ করে। সুতরাং এমন একটি ক্যোয়ারির জন্য যা 100 টি বস্তু ফেরত দেয় তবে প্রতি পৃষ্ঠায় দশটি অবজেক্ট দেখায়, 100 টি বস্তুর উপর অতিরিক্ত প্রক্রিয়াজাতকরণ করা হবে।
wobbily_col

32
আপনি এটিকে হার্ডকোডযুক্ত ইউআরএলগুলি প্রতিস্থাপন করতে পছন্দ করেন না: <a href="?page={{ page_obj.preLive_page_number }} "> পূর্ববর্তী </a>
দ্যালোরে

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 জাঙ্গো ডকুমেন্টেশন থেকে প্যাগিনেশন কোড এবং যুক্ত পৃষ্ঠাগুলি কেবলমাত্র একটি সামান্য পরিবর্তন

অ্যাপ্লিকেশন / টেমপ্লেট / অ্যাপ্লিকেশন / 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পদ্ধতির সাথে আমাদের কিছু করার দরকার নেই ।

দ্বিতীয় পদ্ধতিটি কিছুটা জটিল তবে আমরা পৃষ্ঠাবদ্ধতা সম্পর্কে আরও বেশি উপলব্ধি অর্জন করতে পারি এবং জটিল পৃষ্ঠাগুলি বা বিভিন্ন পৃষ্ঠাগুলি কাস্টমাইজ করতে পারি। চলো এটা দেখি.

এটি তিনটি ধাপে করা যেতে পারে।

আপনার ওভাররাইড 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 %}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.