Skip to main content

Membuat DRUD Dengan Django

Membuat DRUD 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?

Dalam membuat CRUD dengan django, kita akan menulisnya pada file bernama models.py, ini adalah file khusus yang digunakan untuk menghubungkan ke database. Penggunaan database di django lumayan banyak, dan untuk belajar django kali ini kita tetap menggunakan SQLite default saja terlebih dahulu. Karena, penulisan kodenya sama saja meski menggunakan DBMS berbeda. Untuk menggunakan MySQL atau MariaDB, tinggal mengubah pengaturannya pada file settings.py.

Back to top

1) 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)
Back to top

2) 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.


python3 manage.py makemigrations
python3 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.

Back to top

3) 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


python3 manage.py makemigrations
python3 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.

Back to top