Skip to main content

Django Class Based Views

django class based views

Mari kita melanjutkan kembali belajar django membuat web dengan python, pada halaman ini kita akan khusus membahas tentang Class Based Views dan dihalaman lain saya juga sudah membahas tentang Function Based Views. Yang belum membaca halaman cara membuat website sendiri harap dibaca terlebih dahulu ya. Ok. Biar kita bisa nyambung dengan tulisan yang ini, karena tulisan membuat web dengan python ini adalah lanjutan dari tulisan sebelumnya yang membahas tentang membuat website dengan django.

Pada file views.py kita bisa menggunakan class atau juga menggunakan function dalam penulisan kodenya. Atau bisa menggunakan keduanya untuk kebutuhan tertentu. Kalau memilih lebih mudah mana tentu saja bisa dibilang lebih mudah menggunakan Function daripada Class karena Function Based Views (FBV) lebih sederhana. Tapi kalau kita tinjau manfaatnya, maka akan terlihat bahwa penggunaan Class Based Views (CBV) akan lebih memiliki fitur keren.

Apa yang sudah pernah dibahas disini tentang belajar django mulai dari

  • Perkenalan django: Awal mulai belajar django, mempersiapkan kebutuhan yang diperlukan, membuat virtualenv untuk django, mengenali struktur directory, dan menjalankan server django.
  • Membuat project: mengingat kembali cara membuat virtualenv, membuat project, membuat app dan perbedaannya dengan project, melakukan pengaturan, membuat view (Function Based Views), membuat rute url, dan membuat template. belajar web developer.
  • Membuat Model: dengan model django kita tidak perlu membuat SQL kueri untuk CRUD database kecuali Anda menginginkannya. Membuat superUser Admin, mencoba relationships tabel, membuat form untuk posting artikel, pengaturan media.

Pengembang Django terutama yang masih baru belajar seperti saya, akan lebih mudah memahaminya jika belajar Function Base Views terlebih dahulu, karena FBV lebih sederhana dibandingkan dengan CBV. Tapi kita akan coba membuat CBV lebih sederhana dan dalam hal apa sebaiknya kita menggunakan CBV dibandingkan dengan FBV.

Back to top

1) Praktik Class Based Views

Supaya lebih mudah dipahami, baiknya langsung saja praktik menggunakan Class Based Views. Kalau ada yang sudah lupa mungkin perlu untuk membuka kembali Belajar Web Developer Django dan Cara Membuat Website Sendiri Django baru kemudian praktik latihan ini. Supaya kita memiliki persepsi yang sama. Karena ini juga seri lanjutan dari membuat website dengan python.

Coba sebelumnya Anda lihat dulu (kalau belum) tulisan Django Functions Based Views, kemudian bandingkan dengan yang ini Class Based Views

Django secara default memiliki banyak class yang mewakili banyak fungsi yang mungkin dibutuhkan dalam pengembangan proyek, termasuk render template, instance database, menampilkan instance tertentu, membuat dan mengubah instance, dan lainnya. Menangani kesalahan 404, yang semuanya sudah ada secara default dari framework ini. Kita hanya perlu menggunakannya saja dan itu selesai.

Tentu saja kita juga bisa mereplace dengan menulis ulang metode kelas. Sesuai dengan perilaku yang dibutuhkan mungkin sedikit lebih kompleks.

Misalnya untuk menampilkan seluruh list database cukup dengan model = Artikel bandingkan dengan FBV yang seperti ini artikel = models.Artikel.objects.all(). Dan lagi untuk merender template cukup dengan template_name = 'index.html' ini sudah cukup kalau kita bandingakan dengan FBV maka kodenya seperti ini template = loader.get_template('index.html').

Sekarang kita terapkan pada project yang sedang kita buat, maka

Pertama, kita buat dulu rutenya di blog/ursl.py menjadi seperti ini

from django.urls import path
from blog import views

urlpatterns = [
    path('', views.Index.as_view())
]

Pada function based views kita menggunakan seperti ini path('', views.Index) dan di Class Based Views diubah menjadi seperti ini path('', views.Index.as_view()) kemudian membuat view-nya di blog/views.py

from django.views import generic
from blog.models import Artikel

Import generic views dan juga import class Artikel pada models yang sudah kita buat. Lalu membuat class Index, sesuai dengan yang dibuat pada blog/urls.py

class Index(generic.ListView):
    model = Artikel
    template_name = 'index.html'

Cukup seperti itu kita sudah bisa mengambil seluruh data dari tabel Artikel dan menampilkannya dihalaman index.html.

Kemudian pada index.html buat seperti ini

{% for post in object_list %}
    <h3><a href="/blog/{{ post.slug_post }}">{{ post.judul_post }}</a></h3>
    <p>{{ post.body_post }}</p>
    <p>Penulis: {{ post.penulis }} Tanggal: {{ post.tanggal_post }}</p>
{% endfor %}

post pada {% for post in object_list %} bisa Anda buat namanya sesuai selera dan object_list ini adalah instances dari model. Bandingkan yang kita buat menggunakan function def Index kemarin. Kode ini sudah bisa menampilkan seluruh isi dari tabel Artikel. Tapi... kalau artikel kita sudah ratusan jumlahnya, maka itu tidak mungkin akan ditampilkan seluruhnya pada halaman home. Dan kita akan menampilkannya hanya 5 sampai 10 artikel saja yang terbaru. Atau bisa juga dengan pagination (tapi kita bahas dihalaman lain ya..)

Untuk menampilkan artikel hanya 5 terbaru saja, maka kita akan menambahkan satu baris kode lagi yaitu paginate_by = 5 di blog/views.py pada class Index. 5 bisa Anda ganti dengan angka berapa saja sesuai berapa artikel yang ingin ditampilkan perhalaman.

Selain itu juga, kita masih bisa menambahkan context tambahan, misalnya page title, seperti yang kita buat di FBV sebelumnya.

extra_context = {
    'title': 'edikartono.com Belajar Django',
}

Lalu menempelkannya pada tag title dihalaman index.html. Kalau kita praktik dari yang sebelumnya sudah ada, jadi tinggal refresh saja langsung muncul page titlenya.

<title>{{ title }}</title>

Berikut ini kode lengkapnya

urls.py

from django.contrib import admin
from django.urls import path, include
from blog import views as blg
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    path('', blg.Index.as_view())
]

if settings.DEBUG:
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

blog/urls.py

from django.urls import path
from blog import views

urlpatterns = [
    path('', views.Index.as_view())
]

blog/views.py

from django.views import generic
from blog.models import Artikel

class Index(generic.ListView):
    model = Artikel
    template_name = 'index.html'
    paginate_by = 1
    extra_context = {
        'title': 'edikartono.com Belajar Django'
    }

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ title }}</title>
</head>
<body>
    <h1>Belajar Django Bersama edikartono.com</h1>
    {% for post in object_list %}
    <h3><a href="/blog/{{ post.slug_post }}">{{ post.judul_post }}</a></h3>
    <p>{{ post.body_post }}</p>
    <p>Penulis: {{ post.penulis }} Tanggal: {{ post.tanggal_post }}</p>
    {% endfor %}
</body>
</html>

Ok, untuk tampilan index sudah selesai, bisa langsung dicoba runserver untuk melihat hasilnya

Back to top

2) Detail View

Menampilkan artikel tidak hanya list saja, namun kita juga akan membuat tampilan detail artikel atau full artikel dalam satu halaman.

Tambahkan rute baru di blog/urls.py dengan kode path('<slug:tp>', views.Detail.as_view()), kode ini diletakkan sebelum index agar python membacanya terlebih dahulu. Kalau ditempatkan dibawah Index, kode ini tidak terbaca dan tentu tidak bisa dieksekusi.

Buka blog/views.py dan buat kelas baru yaitu class Detail sesuaikan yang dibuat pada rute.

class Detail(generic.DetailView):
    model = Artikel
    template_name = 'detail.html'
    slug_field = 'slug_post'
    slug_url_kwarg = 'tp'
  1. class Detail(generic.DetailView): membuat class bernama Detail, ini extend dari DetailView
  2. model = Artikel Mengambil data dari tabel Artikel
  3. template_name = 'detail.html' menentukan nama file template yang digunakan untuk menampilkan.
  4. slug_field = 'slug_post' memilih kolom slug_post dari tabel Artikel.
  5. slug_url_kwarg = 'tp' filter yang digunakan berdasarkan data dari slug url, lihat lagi penulisan blog/urls.py

Kalau saya mencoba untuk menerjemahkan, kira-kira bunyinya seperti ini Dari tabel Artikel model = Artikel ambil data yang berisi slug_url_kwarg = 'tp' pada kolom slug_post slug_field = 'slug_post' kemudian tampilkan pada detail.html template_name = 'detail.html'.

Sekarang bagaimana menampilkannya pada halaman detail.html, karena ini beruba obj maka kita menggunakan keyword object(.)nama_kolom diapit dalam dua kurung kurawal {{ object.nama_kolom }}. Full kodenya seperti berikut:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ object.judul_post }}</title>
</head>
<body>
    <h1>{{ object.judul_post }}</h1>
    <span>Penulis: {{object.penulis}}, Tanggal: {{object.tanggal_post}}, Kategori: {{object.kategori_post }}</span>
    <p>
        <img src="{{ object.gambar_post.url }}" alt="{{ object.judul_post }}"/>
        {{ object.body_post }}
    </p>
</body>
</html>
Back to top

3) Full Kode

Lampiran full kode untuk praktik Class Base Views kita hari ini

3.1) blog/urls.py

Ini untuk blog/urls.py, karena pada urls.py tidak mengalami perubahan, jadi masih sama seperti yang di atas pada bagian class Index.

from django.urls import path
from blog import views

urlpatterns = [
    path('<slug:tp>', views.Detail.as_view()),
    path('', views.Index.as_view())
]

3.2) blog/views.py

from django.views import generic
from blog.models import Artikel

class Index(generic.ListView):
    model = Artikel
    template_name = 'index.html'
    paginate_by = 3
    extra_context = {
        'title': 'edikartono.com Belajar Django'
    }

class Detail(generic.DetailView):
    model = Artikel
    template_name = 'detail.html'
    slug_field = 'slug_post'
    slug_url_kwarg = 'tp'

Untuk halaman detail.html sudah ada di atas ya...👍️👍️👍️

Back to top

4) Kesimpulan

Setelah kita membandingkan antara Function Based Views dan Class Based Views tentu bisa mengambil kesimpulan bahwa

  • Dapat dengan mudah extend kode, atau menggunakan kembali
  • Bisa multiple inharitance
  • Menangani respon HTTP metode dengan class berbeda
  • Ada built in class based views
  • Kode lebih ramping

Dengan memanfaatkan built in Class Based Views maka kode program kita menjadi lebih ramping, kecuali Anda ingin mengoverride misalnya queryset atau get_queryset (belum kita pelajari). Tapi kelemahan dari Class Based View adalah agak sulit untuk dibaca kodenya dibandingkan dengan Function. Dan kembali lagi kepada Anda, mau lebih nyaman menggunakan yang mana

Back to top