ویدیو آموزش صفحه بندی اطلاعات در جنگو

امیرحسین بیگدلو April 2023

در این ویدیو با نحوه صفحه بندی اطلاعات در جنگو آشنا میشوید. برای صفحه بندی اطلاعات از کلاس Paginatior استفاده میشود.

برای صفحه بندی اطلاعات در class based viewها به شکل زیر کار میکنید:

from django.views.generic import ListView

from myapp.models import Contact

class ContactList(ListView):
    paginate_by = 2
    model = Contact

و برای صفحه بندی در function base viewها به شکل زیر:

from django.core.paginator import Paginator
from django.shortcuts import render

from myapp.models import Contact

def listing(request):
    contact_list = Contact.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page.

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'list.html', {'page_obj': page_obj})

بعد از تکه کردن آبجکت ها در view میتوانید اطلاعات را در template نشان دهید:

{% for contact in page_obj %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br>
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

 

ویدیوهای مشابه



آموزش monkey patch در پایتون
امیرحسین بیگدلو

ارسال نظر


mohammad

1 سال قبل پاسخ به نظر

سلام ممنونم بابت این محتوا ها
میخاستم بگم امکانش هست یه ویدیو درست کنید در مورد بازار کار جنگو(پایتون) و یا کلا مباحث مورد نیاز شرکت ها و پروژه های واقعی؟
باتشکر.

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
تمام مواردی که گفتم توی دنیای واقعی کاربرد داره.

دریمر

2 سال قبل پاسخ به نظر

ویدئو هاست عالین دمت گرم
منتها کیفیت خیلی بالاست و رو نت ایران همش گیر میکنه موقع پخش
اگه امکان داره یا امکان دانلود بده یا اینکه چنتا کیفیت بذار
ممنونم ازت

ارسال نظر



باب

3 سال قبل پاسخ به نظر

درود
من یه مشکلی برام پیش اومده ، نتونستم حلش کنم ، ممکنه یه راهنمایی بکنی
برای پروژه وبلاگ ، چجوری میتونیم با استفاده از CBV کامنت های یک مقاله رو paginate بکنیم ؟

ارسال نظر



محمد احمدی

3 سال قبل پاسخ به نظر

درود
آقا یه سوال اینکه خیلی از وبسایت ها با اسکرول کاربر به پایین صفحه کوئری صدا میزنن و مثلا پنجاه تا آبجکت میکشن بیرون با api انجام میشه؟
کلا راهش چیه؟
ممنون

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

سلام
اینکار با javascript انجام میشه

باب

3 سال قبل پاسخ به نظر

درود دوباره
ببخشید این حالت اصلا بهینه نیست ، ما باید با توجه به شماره پیج که از سمت کاربر میاد و همچنین تعدادی که قرار هست تو صفحه نمایش داده بشه ، دیتا رو از دیتابیس واکشی کنیم ، اینجوری مثلا اگه 1000 تا مقاله داریم به فرض ، وقتی مثلا پیج اول رو درخواست می کنیم ، 1000 تا مقاله از دیتابیس واکشی میشه که هم فشار میاد به سرور هم اصلا لازمشون نداریم تو صفحه اول
چجوری میتونیم limit و offset برای query تعیین کنیم که الکی دیتا از دیتابیس نخونیم ؟
چون اینجا از manager استفاده میکنیم ، نمیدونم چجوریه ، ولی خب اگه دستی query می نوشتیم ، قابل حل بود
امیدوارم منظورمو درست رسونده باشم

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

دیگه داری شاخ میشی :)
اینکار کاملا بهینه‌اس.
چیزی که دقت نکردی اینکه کوئری‌ها داخل جنگو تنبل هستند و تا زمانی که مجبور نباشن از دیتابیس اطلاعات رو نمیخونن.
زمانی که شما کوئری میزنی مثلا Contact.objects.all() جنگو هنوز اطلاعات رو از دیتابیس نخونده. شما میای نتیجه این کوئری رو میدی به کلاس Paginator و این کلاس میاد تکه تکه اطلاعات رو از دیتابیس میخونه.
پس ما حتی اگر 1000 تا رکورد داخل دیتابیس داشته باشیم، تمام این 1000تا یکجا واکشی نمیشن.


امیرحسین بیگدلو

3 سال قبل

در ضمن این روشی هست که داکیومنت گفته. هیچوقت رو حرف داکیومنت حرف نزن


باب

3 سال قبل

درود فراوان
:D
ازون لحاظ ، خب من از داستان lazy بودن ، خبر نداشتم ،
بله راست میگید ، الان که ویدیو مربوط به lazy رو دیدم بعد doucument رو خوندم متوجه شدم
دوستان از لینک زیر استفاده کنید :
https://www.mongard.ir/one_part/69/django-lazy-querysets/

هرچی document بگه :D

باب

3 سال قبل پاسخ به نظر

درود ،
دلیل اینکه کار نمیکنه اینه که مقدار ارسالی به صفحه str هست ، باید اونو int کنید بعد بفرستید به template تا عملگر == کار بکنه
یعنی این خط کد باید اضافه بشه

page_number = int(page_number)

ارسال نظر



باب

3 سال قبل

درود

دوستان این روش هم باگ داره و اصلا استفاده نکنید

طبق document پیش برید ،

amir

4 سال قبل پاسخ به نظر

اگر بخوایم لینک تمام صفحات رو نشون بدیم باید چیکار کنیم؟

ارسال نظر



امیرحسین بیگدلو

4 سال قبل

هر چند که پیشنهاد نمیشه همچین کاری انجام بدین اما میتونید داخل
page_obj.paginator.page_range
حلقه for بزنید.
page_range تعداد تمام صفحات رو به شکل range میاره

مونگارد