Tingkatkan efisiensi dan skalabilitas aplikasi Django Anda dengan menerapkan paginasi. Inilah semua yang perlu Anda ketahui untuk memulai.
Paginasi meningkatkan pengalaman pengguna dan kinerja aplikasi saat menangani kumpulan data besar. Tanpa sistem pagination, aplikasi Anda akan sering mengalami lagging. Dengan Django, Anda dapat memanfaatkan dukungan bawaan untuk paginasi untuk membuat paginasi aplikasi web Anda.
Bagaimana Paginasi Bekerja di Django
Menerapkan paginasi di Django dapat berbeda tergantung pada apakah Anda bekerja dengan tampilan berbasis kelas atau berbasis fungsi. Terlepas dari metode pilihan Anda, prinsip dasarnya tetap sama.
Django menggunakan kelas bernama Paginator untuk menerapkan paginasi. Itu Paginator class menyediakan beberapa metode yang dapat Anda gunakan untuk menyesuaikan paginasi Anda. Saat menginisialisasi Paginator kelas, dibutuhkan dua parameter wajib; data yang akan diberi nomor halaman, dan jumlah item yang akan ditampilkan per halaman. Itu Paginator mengambil parameter opsional ketiga untuk anak yatim piatu untuk menentukan jumlah minimum item yang harus tetap berada di halaman terakhir. Secara default, nilai dari Orphans adalah 0 artinya semua halaman memiliki jumlah item yang sama.
URL untuk halaman dengan paginasi Django serupa dengan ini: https://example.com/products/?page=3. Itu halaman parameter di URL memberi tahu Django halaman mana yang ingin dilihat pengguna. Itu juga membantu Django menentukan bagian mana dari data yang akan ditampilkan untuk halaman itu.
Kode yang digunakan dalam proyek ini tersedia di a repositori GitHub dan gratis untuk Anda gunakan di bawah lisensi MIT.
Siapkan Proyek Django Anda untuk Paginasi
Sebelum Anda melakukan paginasi di Django, Anda harus memiliki menginstal Django dan mengaturnya di komputer Anda. Setelah menyiapkan Django di komputer Anda, Anda harus membuat aplikasi dan model untuk data Anda. Ini adalah model sederhana yang dapat Anda salin:
dari django.db impor model
kelasPos(model. Model):
judul = model. CharField (max_length=255)
penulis = model. CharField (max_length=50)
konten = model. Bidang Teks('Posting konten')
def__str__(diri sendiri):
kembali self.title
Model di atas adalah untuk aplikasi blog. Ini menentukan bidang judul, penulis, dan konten untuk setiap posting blog. Itu juga memiliki metode yang mengembalikan judul posting untuk pengalaman pengguna yang lebih baik di panel admin.
Migrasikan model Anda dengan menjalankan perintah ini:
python manage.py makemigrations && python manage.py migrasi
Setelah memigrasikan model Anda, Anda harus menavigasi ke blog>admin.py untuk mendaftarkannya. Kode berikut berhasil mendaftarkan model yang dipanggil Pos.
dari django.contrib impor admin
dari .model impor Pos # ganti 'Posting' dengan nama model Anda
admin.site.register (Posting)
Selanjutnya, buat superuser dan tambahkan posting di panel admin Django Anda. Untuk membuat superuser, gunakan perintah ini:
python kelola.py buatpengguna super
Perintah di atas akan membawa Anda melalui proses yang diilustrasikan pada gambar di bawah ini:
Setelah membuat superuser, jalankan server pengembangan Anda dan arahkan ke panel admin.
python mengelola.py runserver
Setelah server Anda mulai, navigasikan ke http://127.0.0.1:8000/admin, masuk, dan tambahkan beberapa posting.
Selanjutnya, buat template HTML untuk merender postingan Anda di browser. Buat file Anda di direktori berikut: your_app/templates/your_app_name/index.html. Jika Anda tidak mengerti cara membuat template, baca kami panduan pengantar untuk arsitektur MVT Django.
Paginasi Django dalam Tampilan Berbasis Fungsi
Django memungkinkan Anda membangun aplikasi dengan tampilan berbasis kelas atau tampilan berbasis fungsi. Untuk paginasi aplikasi Anda menggunakan tampilan berbasis fungsi. Ikuti langkah ini:
- Bukalah views.py file dan impor Paginator kelas.
dari django.core.paginator impor Paginator
- Buat fungsi tampilan untuk merender postingan di template HTML Anda.
dari django.shortcuts impor memberikan
dari .model impor Pos
dari django.core.paginator impor Paginator
defdaftar_tampilan(meminta):
posts = Post.objects.all()
kembali memberikan (permintaan, 'blog/blog_list_view.html', {'postingan':posting})
- Buat pola URL untuk menampilkan postingan Anda di browser. Mulailah dengan mengonfigurasi pola URL di direktori proyek Anda. Buka urls.py file di tingkat proyek dan tambahkan ini ke pola url:
dari django.urls impor termasuk
pola url = [
...,
jalur('', termasuk('blog.url')),
]
Dalam cuplikan kode di atas, ganti blog dengan nama aplikasi Anda. Jika Anda tidak dapat membedakan antara proyek dan aplikasi, Anda harus mengetahuinya bagaimana proyek berbeda dari aplikasi di Django.
Setelah melakukan konfigurasi di atas, buatlah a urls.py file di direktori aplikasi Anda (dalam hal ini, itu adalah blog folder) dan tambahkan potongan kode ini:
dari django.urls impor jalur
dari .view impor daftar_tampilan
pola url = [
jalur('', tampilan_daftar, nama='tampilan daftar'),
]
Saat Anda menjalankan server dan menavigasi ke http://127.0.0.1:8000/, browser akan menampilkan posting Anda sesuai dengan style sheet yang Anda tentukan.
- Ubah fungsi tampilan Anda untuk menambahkan logika pagination. Ini contohnya:
defdaftar_tampilan(meminta):
posts = Post.objects.all()
paginasi = Paginator (posting, 3)
page_number = permintaan. DAPATKAN.dapatkan('halaman') #Dapatkan nomor halaman yang diminta dari URL
halaman = paginasi.get_halaman (nomor_halaman)
kembali memberikan (permintaan, 'blog/blog_list_view.html', {'halaman':halaman})
Cuplikan kode di atas memperkenalkan tiga variabel baru: diberi nomor halaman, nomor halaman, Dan halaman. Setiap variabel melakukan hal berikut:
- Itu diberi nomor halaman variabel diinisialisasi Paginator kelas. Dalam skenario ini, data yang akan diberi nomor halaman adalah kumpulan kueri, posting, dan dibutuhkan 3 sebagai jumlah item untuk ditampilkan per halaman.
- Itu nomor halaman variabel mendapatkan nomor halaman dari URL. Misalnya, di http://127.0.0.1:8000/?page=2, nomor halamannya adalah 2.
- Itu halaman variabel mengambil halaman tertentu untuk dirender dari diberi nomor halaman variabel.
Saat ini, Django pasti sudah membuat halaman halaman Anda. Anda dapat menavigasi ke halaman dengan halaman tertentu menggunakan format URL yang ditunjukkan pada gambar ini:
- Ubah template HTML Anda untuk menampilkan navigasi untuk halaman yang diberi halaman. Menggunakan metode yang tersedia di Paginator class memungkinkan Anda membuat navigasi sederhana di halaman Anda. Berikut adalah contoh yang dapat Anda tambahkan di bawah kode HTML awal Anda:
{% jika halaman.has_previous %}
<Ahref="?page={{page.previous_page_number}}"
class="btn btn-secondary mx-NN">SebelumnyaA>
{% berakhir jika %}<Ahref="?halaman=1"kelas="btn btn-sekunder">PertamaA>
{% untuk num di page.paginator.page_range %}
{% jika num == halaman.nomor %}
<menjangkau>{{ angka }}menjangkau>
{% kalau tidak %}
<Ahref="?halaman={{num}}"kelas="btn btn-sekunder mx-2">
{{ angka }}
A>
{% berakhir jika %}
{% akhir untuk %}<Ahref="?page={{page.paginator.num_pages}}"kelas="btn btn-sekunder mx-2">
Terakhir
A>
{% jika halaman.has_next %}
<Ahref="?page={{page.next_page_number}}"kelas="btn btn-sekunder mx-2">
Berikutnya
A>
{% berakhir jika %}
Dalam cuplikan kode di atas, metode berikut digunakan bersama dengan pernyataan bersyarat untuk menentukan tampilan navigasi pagination:
- has_previous: Metode ini kembali BENAR jika ada halaman sebelumnya dalam data paginasi.
- nomor_halaman_sebelumnya: Metode ini mengembalikan nilai halaman sebelumnya.
- rentang_halaman: Metode ini memberi tahu Anda berapa banyak halaman yang Anda miliki di data paginasi Anda.
- nomor: Metode ini mengembalikan nilai halaman saat ini.
- num_pages: Metode ini mengembalikan jumlah total halaman.
- has_next: Fungsi ini kembali BENAR jika ada halaman berikutnya dalam data paginasi.
- next_page_number: Metode ini mengembalikan nilai halaman berikutnya.
Paginasi Django dalam Tampilan Berbasis Kelas
Dalam tampilan berbasis kelas, Anda tidak perlu mengimpor dan menginisialisasi Paginator kelas. Untuk menerapkan paginasi dalam tampilan berbasis kelas, Anda harus menentukan atribut yang disebut paginate_by. Ikuti langkah-langkah ini untuk memberi nomor aplikasi Anda dengan tampilan berbasis kelas:
- Tulis tampilan berbasis kelas dan tentukan paginate_by atribut. Berikut contoh sederhananya:
dari .model impor Pos
dari django.views.generic impor Tampilan Daftar
kelasPostListView(Tampilan Daftar):
model = Posting
nama_template = 'blog/blog_list_view.html'
konteks_objek_nama = 'halaman'
paginasi_oleh = 2
Tampilan di atas adalah versi berbasis kelas dari tampilan berbasis fungsi yang ditulis sebelumnya. Tampilan ini mewarisi milik Django Tampilan Daftar kelas, digunakan untuk daftar item. Ini mendefinisikan logikanya dengan atribut seperti model, template_name, konteks_objek_nama, Dan paginate_by. Itu paginate_by atribut menentukan berapa banyak posting yang akan ditampilkan per halaman; dalam hal ini, 2 posting.
- Setelah Anda membuat tampilan, ubah urls.py berkas untuk menggunakannya. Berikut adalah contoh sederhana:
dari .view impor PostListView
pola url = [
jalur('', PostListView.as_view(), nama='tampilan daftar'),
]
- Ubah template HTML Anda untuk digunakan halaman_obj untuk paginasi.
{% jika page_obj.has_previous %}
<Ahref="?page={{page_obj.previous_page_number}}"
class="btn btn-secondary mx-NN">SebelumnyaA>
{% berakhir jika %}<Ahref="?halaman=1"kelas="btn btn-sekunder">PertamaA>
{% untuk num di page_obj.paginator.page_range %}
{% jika num == page_obj.number %}
<menjangkaukelas="halaman saat ini">{{ angka }}menjangkau>
{% kalau tidak %}
<Ahref="?halaman={{num}}"kelas="btn btn-sekunder mx-2">
{{ angka }}
A>
{% berakhir jika %}
{% akhir untuk %}<Ahref="?page={{page_obj.paginator.num_pages}}"
class="btn btn-secondary mx-NN">
Terakhir
A>
{% jika halaman.has_next %}
<Ahref="?page={{page_obj.next_page_number}}"
class="btn btn-secondary mx-NN">
Berikutnya
A>
{% berakhir jika %}
Berbeda dengan template HTML untuk tampilan berbasis fungsi, template ini menggunakan halaman_obj alih-alih halaman untuk mewakili objek halaman. Ini adalah perilaku default untuk paginasi berbasis kelas di Django.
Gunakan Paginasi untuk Membuat Aplikasi Anda Skalabel
Paginasi mengurangi beban pada server/database Anda dengan mengambil dan menampilkan subkumpulan data yang lebih kecil sekaligus. Dengan pagination, performa website Anda akan meningkat. Pengguna Anda juga akan memiliki pengalaman yang baik saat menggunakan aplikasi Anda.
Tampilan berbasis kelas menghemat lebih banyak waktu dan kode jika dibandingkan dengan tampilan berbasis fungsi, tetapi Anda dapat menggunakan salah satunya tergantung pada preferensi dan spesifikasi proyek Anda.