Membuat CRUD Dengan Django
Membuat CRUD Dengan Django

CRUD singkatan dari Create, Read (Retrieve), Update (Modify), dan Delete (Destroy). Dalam semua program database (DBMS) ini adalah fungsi standar yang pasti dimiliki. CRUD juga memiliki definisi berbeda seperti Read ada yang diterjemahkan sebagai mengambil, Update bukan memperbarui tapi mengubah, dan Destroy atau menghancurkan definisi lain dari menghapus (delete). Singkatan ini juga bisa diperluas pengertiannya menjadi lebih kompleks, ini biasanya berlaku untuk data yang lebih besar yaitu menggunakan pagination agar lebih mudah dan menghemat memori. Bagaimana membuat CRUD dengan Django?

Daftar Isi

 

Apa itu CRUD

Apa yang sudah dijelaskan pada awal tulisan ini, yaitu singkatan yang memiliki arti membuat, menulis, mengedit, dan menghapus. CRUD juga bisa memiliki arti berbeda dan pada data yang banyak, CRUD mengalami tingkatan penggunannya menjadi CRUDL, yaitu tambahan pagination.

Variasi lain dari CRUD adalah

  • BREAD (Browse, Read, Edit, Add, Delete)
  • DAVE (Delete, Add, View, Edit)
  • CRAP (Create, Replicate, Append, Process)

Membuat CRUD dengan Django

Sebelum membuat CRUD dengan django, rencanakan terlebih dahulu seperti apa tabel database yang akan dibuat. Pada contoh ini, saya akan membuat tabel bernama artikel, yang terdiri dari kolom judul, summary, body, gambar, kategori, tanggal post, tanggal edit, penulis, dan slug.

Berikut cara penulisannya pada models.py

Import terlebih dahulu komponen yang dibutuhkan, yaitu models dan slugify. Slugify ini untuk membuat slug otomatis pada setual tulisan yang dibuat, agar menjadi url.

from django.db import models
from django.utils.text import slugify

Setelah itu, kita sekarang akan membuat tabel yang bernama Artikel. Tabel dengan kolom yang sudah kita tentukan tadi sebelumnya. Setiap kolom pada tabel, di model diwakili dengan sebuah field. Yang kode programmnya seperti ini

class Artikel(models.Model):
    judul = models.CharField(max_length=200, unique=True)
    summary = models.TextField()
    body = models.TextField()
    gambar = models.ImageField(upload_to='%Y/%m/%d')
    kategori = models.CharField(max_length=100)
    tanggal_post = models.DateTimeField(auto_now_add=True)
    tanggal_edit = models.DateTimeField(auto_now_add=True)
    penulis = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, blank=True, unique=True)

Ok, program kita sudah jadi. Ini bisa digunakan untuk mengambil data, tapi belum bisa digunakan untuk mengupdate dan membuat post artikel. Untuk bisa membuat post artikel maka perlu menambahkan beberapa baris kode lagi.

    def save(self):
        self.slug_post = slugify(self.judul_post)
        super(Artikel, self).save()
    
    def __str__(self):
        return "{} | {}".format(self.id, self.judul_post)

Kode tersebut diletakkan dalam satu blok dengan class Artikel(models.Model):. Fungsi def save(self): untuk menyimpan artikel kita pada tabel artikel, dan membuat slug secara otomatis pada kode self.slug_post = slugify(self.judul_post). Slug ini diambil dari judul, dan mengganti spasi dengan (-). Karena itu pada field dibuat blank=True.

Pada gambar = models.ImageField(upload_to='%Y/%m/%d') ini untuk mengupload gambar dan file gambar akan ditempatkan pada folder media/tahun/bulan/tanggal bisa dilihat pada parameter upload_to='%Y/%m/%d'. Field ini membutuhkan satu modul python bernama pillow untuk bisa melakukan fungsinya. Untuk itu, install pillow dengan cara pip3 install pillow. Kemudian, kita juga melakukan satu pengaturan pada settings.py untuk menentukan folder yang akan ditempati gambar.

Tambahkan kode ini pada file settings.py boleh pada bagian akhir kode.

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Saat ini database masih kosong, belum ada tabel bernama Artikel, di Django kita tidak perlu membuat tabel dan membuat kolom secara manual. Cukup dengan membuat models seperti di atas dan melakukan migrate untuk membuat tabelnya sesuai dengan model yang dibuat.

python manage.py makemigrations
python manage.py migrate

Dengan kedua perintah di atas python3 manage.py makemigrations, Django akan memeriksa pada database kita. Apakah sudah ada tabel bernama Artikel atau belum, kalau ternyata sudah ada maka akan diperiksa setiap kolom apakah sama atau tidak. Kalau ternyata tidak ada, ataupun kalau tabel Artike sudah ada dan ternyata tidak sama, maka ketika menjalankan perintah python3 manage.py migrate Django akan membuat dan menyesuaikan dengan yang di models.py.

Setelah ini kita sudah bisa membuat, mengedit, dan menghapus artikel melalui Admin panel Django. Tapi ada satu kelemahan kalau ada beberapa user dalam satu website, yaitu field kategori. Letak kelemahannya adalah field tersebut kalau user lain mengisi field kategori semaunya, pastinya akan ada banyak kategori yang tidak perlu, atau malah mirip karena perbedaan karakter misal kapital besar dan kapital kecil. Untuk mengatasi itu, menggunakan database relasi (relationship). Nanti pada field kategori, sudah ditentukan dulu oleh superuser. Lalu user lain hanya bisa memilih lewat dropdown, jadi tidak ada yang bisa menambah kategori baru selain superuser.

Database Relationship

Untuk membuat seperti yang dimaksud, perlu ada satu tabel lagi yang khusus untuk menyimpan kategori. Tidak banyak field yang diperlukan hanya nama kategori dan slug kategori. Tambahkan kode ini sebelum class Artikel

class Kategori(models.Model):
    nama_kategori = models.CharField(max_length=50, unique=True)
    slug_kategori = models.SlugField(blank=True, unique=True)

    class META:
        ordering = ['nama_kategori']

    def save(self):
        self.slug_kategori = slugify(self.nama_kategori)
        super().save()
    
    def __str__(self):
        return self.nama_kategori

Ada tambahan kode yaitu class META: kelas ini hanya untuk mengurutkan berdasarkan nama kategori sesuai abjad.

Kemudian kita melakukan perubahan sedikit pada field kategori menjadi kategori = models.ForeignKey(Kategori, to_field='slug_kategori', on_delete=models.CASCADE, related_name='Category'). Field kategori mengambil value dari nama_kategori di class Kategori.

Kode akhir kita menjadi seperti ini

class Kategori(models.Model):
    nama_kategori = models.CharField(max_length=50, unique=True)
    slug_kategori = models.SlugField(blank=True, unique=True)

    class META:
        ordering = ['nama_kategori']

    def save(self):
        self.slug_kategori = slugify(self.nama_kategori)
        super().save()
    
    def __str__(self):
        return self.nama_kategori

class Artikel(models.Model):
    judul = models.CharField(max_length=200, unique=True)
    summary = models.TextField()
    body = models.TextField()
    gambar = models.ImageField(upload_to='%Y/%m/%d')
    kategori = models.ForeignKey(Kategori, to_field='slug_kategori', on_delete=models.CASCADE, related_name='Category')
    tanggal_post = models.DateTimeField(auto_now_add=True)
    tanggal_edit = models.DateTimeField(auto_now_add=True)
    penulis = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, blank=True, unique=True)

    def save(self):
        self.slug_post = slugify(self.judul_post)
        super(Artikel, self).save()
    
    def __str__(self):
        return "{} | {}".format(self.id, self.judul_post)

Sudah selesai. Lakukan kembali

python manage.py makemigrations
python manage.py migrate

Supaya perubahan ditulis ke database. Pada form Artikel, field kategori akan berubah menjadi dropdown yang tidak bisa diubah isinya kecuali superuser atau user yang mendapatkan permission untuk mengubahnya.

Selanjutnya, tinggal membuat views, di Django ada dua pilihan tipe views yang bisa dibuat. yaitu Class Based Views dan Function Based Views.

Supaya semua model dapat diregistrasi di admin area, gunakan kode ini

from django.contrib import admin
import blog.models

for model_name in dir(blog.models):
    model = getattr(blog.models, model_name)
    if isinstance(model, type):
        admin.site.register(model)

Karena Django 2.2 hanya bisa meregistrasi model sebanyak maksimal tiga. Jadi dengan kode itu, semua yang ada dimodel bisa diload pada admin area.

Membuat CURD dengen generic.edit

Ok, sekarang kita buat program lengkap untuk melakukan CURD di Django. Pada file views.py Import dulu semua komponen yang dibutuhkan, yaitu

from django.views.generic import ListView, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.forms import widgets
from .models import Artikel

class ArtikelListView(ListView):
    queryset = Artikel.objects.all()

class ArtikelDetailView(DetailView):
    model = Artikel

class ArtikelCreateView(CreateView):
    model = Artikel
    fields = '__all__'

class ArtikelUpdateView(UpdateView):
    model = Artikel
    fields = '__all__'

class ArtikelDeleteView(DeleteView):
    model = Artikel
    success_url = reverse_lazy('blog:list')

Selanjutnya tinggal membuat url pada file urls.py dan juga membuat templatenya. Pada contoh views.py di atas ini, kalau masih ada yang belum jelas silahkan ditanyakan boleh melalui Komentar di bawah ini, atau melali kontak yang ada di atas.