Skip to main content

Cara Membuat Website Sendiri Dengan Belajar Django

cara membuat website sendiri django

Tutorial cara membuat website sendiri ini adalah lanjutan dari tulisan sebelumnya belajar web developer. Silahkan baca terlebih dahulu kalau belum, agar kita bisa mengikuti alur selanjutnya dari serial belajar django. Kalaupun mungkin pernah belajar django ditempat lain, mungkin saja ada langkah yang berbeda di sini.

Pada pembahasan yang lalu, kita sudah mempelajari tentang web app django, mulai dari membuat project, membuat app, dan mengatur setting di file settings.py kemudian membuat rute pada urls.py, membuat static folder, membuat view di blog/views.py, dan menampilkannya pada browser dengan template.

Pembahasan template disana belum lengkap, juga kita belum memulai untuk membuat model yang akan kita bahas pada halaman ini. Dan sekarang kita akan melanjutkan cara membuat website sendiri dan ini adalah bagian ke (3) tiga kita belajar django.

Back to top

1) Selalu Lakukan

Dalam setiap membuat proyek di python, kita akan selalu menggunakan virtualenv termasuk apa yang kita praktikkan sekarang membuat website dengan django. Masih ingat kita direktoru yang kita gunakan untuk mengerjakan proyek membuat web dengan django ini? Kita menggunakan directory dev-django sebagai wadah pekerjaan kita ini, dan menggunakan folfer env untuk virtualenv kita. Juga project yang kita sedang kerjakan ini bernama myproject.

Sekarang saya akan mengaktifkan virtualenv dengan posisi berada di directory myproject. Buka CMD atau terminal Anda semua, masuk ke directory myproject dan ketik perintah ini source ../env/bin/activate. Kalau sedang berada di directory dev-django berarti perintahnya adalah source env/bin/activate ada perbedaan pada ../

Dan sekarang kita sudah siap untuk membuat web dengan python django, lalu buka teks editor kesayangan Anda semua. Disini saya menggunakan Visual Code Studio, dan kalau di VCode Studio juga bisa memilih interpreter path juga. Caranya klik pada bagian paling kiri dari status bar (python extention) lalu pilih interpretet path yang tersedia disistem Anda.

membuat web dengan python django
Back to top

2) Tentang Model

Model pada django adalah sarana aplikasi website kita berinteraksi dengan database, menggunakan model akan memudahkan kita dalam membangun situs yang lebih cepat. Kalau Anda membuat situs sederhana dan statis, maka models.py tidak diperlukan. Tapi kalau Anda membuat halaman statis dengan django, sungguh Anda telah menyia-nyiakan fitur luar biasa ini.

Model sangat membantu dalam mengembangkan aplikasi web modern yang tentu saja membutuhkan database. Kalau dalam pemrograman PHP, membuat sistem CRUD dengan database akan melelahkan membuat SQL sendiri. Tapi disini Anda hanya memanfaatkan saja tanpa perlu menggunakan SQL sama sekali untuk mengakses database, kecuali Anda menginginkannya.

Model Django menggunakan ORM (Object Relational Mapping) ke underlying database ini adalah teknik yang mudah untuk bekerja dengan database. Meskipun setiap database mengimplementasikan bentuk SQL berbeda dan kadang sangat kompleks, dengan pemetaan ORM program tidak perlu mengetahui struktur database dan juga tidak membutuhkan SQL yang rumit untuk manipulasi data. Sebab itu jika Anda ingin tau cara membuat website sendiri yang lebih mudah, maka belajar django mungkin akan lebih membantu.

Model adalah satu-satunya yang menghubung kedatabase, pada model dapat berisi field dan behaviors (perilaku) bagaimana data akan disimpan dan diambil. Model adalah subclass dari kelas python django.db.models.Model, juga setiap attribut pada model itu mewakili satu field pada database.

Sekarang kita akan langsung membuat model untuk blog app, oh iya sebelum melanjutkan dan mumpung ingat, nama class adalah nama tabel dan attributnya adalah nama field. Django secara resmi mendukung 4 jenis database, namun Anda bisa menambahkannya selain itu jika diperlukan. Keempat database itu adalah PostgreSQL, Mysql/MariaDB, SQLite, dan Oracle.

Untuk tahap pengembangan (development) disarankan tidak menggunakan selain SQLite. Jadi saat ini kita menggunakan SQLite dulu saja.

2.1) Membuat Model

Karena kita sedang praktik membuat blog app, jadi sebelum membuat modelnya saya ingin merancang dulu field apa saja yang sekiranya diperlukan pada halaman ini cara membuat website sendiri.

Umumnya blog memiliki judul, body (teks/isi artikel), nama penulis, tanggal terbit, dan slug (url) jangan lupa gambar. Kira-kira itu isi dari model kita saat ini.

Buka file blog/models.py atau kalau belum ada bisa dibuat sendiri file models.py dalam folder blog. Dan berikut ini isinya:

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

class Artikel(models.Model):
    judul_post = models.CharField(max_length=200, unique=True)
    body_post = models.TextField()
    penulis = models.CharField(max_length=100)
    tanggal_post = models.DateTimeField(auto_now_add=True)
    slug_post = 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)

class Artikel(models.Model): membuat class bernama Artikel, yang ini juga berarti akan membuat tabel pada database bernama Artikel, dengan memiliki field berupa:

  1. judul_post = models.CharField(max_length=200, unique=True) field dan kolom bernama judul_post ini berupa varchar dengan panjang maksimum 200 dan bersifat unik. Maksudnya setiap judul post yang kita buat tidak boleh sama. Berguna untuk menghindari duplikat.
  2. body_post = models.TextField() berupa TextArea untuk kita membuat isi dari artikel.
  3. penulis = models.CharField(max_length=100) kolom ini juga berupa varchar yang memiliki panjang maksimum 100, maksudnya untuk mengisi nama penulis artikel.
  4. tanggal_post = models.DateTimeField(auto_now_add=True) kolom datetime, tanggal dan waktu yang akan dibuat otomatis mengambil dari tanggal dan jam saat artikel dibuat.
  5. slug_post = models.SlugField(max_length=100, blank=True, unique=True) kolom untuk meyimpan slug. Field ini boleh kosong dengan menambahkan blank=True, pada model yang tidak berisi blank=True itu artinya harus diisi atau tidak boleh kosong, dan defaultnya seperti itu.
  6. def save(self): fungsi untuk menyimpan artikel yang dibuat atau diedit.
  7. self.slug_post = slugify(self.judul_post) ini kode untuk mengisi field slug_post secara otomatis yang mengambil value dari judul_post dan sudah ditambahkan tanda (-) pada setiap spasi. Setiap ada spasi otomatis diganti dengan dash (-)
  8. super(Artikel, self).save() proses menyimpan artikel saat tombol ditekan
  9. return "{} | {}".format(self.id, self.judul_post) kode untuk bagaimana postingan kita ditampilkan (dalam admin) dengan format ID | judul post.

Model kita sudah jadi dibuat, tapi ini belum dituliskan kedatabase. Kalaupun Anda menjalankan perintah runserver maka tidak terjadi apa-apa dan juga belum bisa mengisi artikel untuk dipublish. Untuk itu perlu melakukan migrate seperti berikut.

python3 manage.py migrate
cara membuat website dengan django

Untuk pertama kalinya bisa langsung menggunakan perintah itu untuk membuat database. Dan selanjutnya jika ada perubahan field pada models.py

python3 manage.py makemigrations
python3 manage.py migrate

makemigrations untuk memeriksa jika ada perbedaan antara models.py dan tabel database yang sudah ada, kemudian migrate untuk menulis ke database atas perubahan yang terjadi.

2.2) Membuat SuperUser

Setelah kita eksekusi migrate tanpa error, tabel database kita sudah berhasil dibuat. Dan untuk mengisi tulisan pada tabel Artikel belum bisa dilakukan karena jika kita login ke 127.0.0.1/admin tidak bisa sebab belum ada user satupun yang tersimpan dalam database. Untuk itu eksekusi perintah ini untuk membuat user yang berlevel paling tinggi yaitu superUser atau ditempat lain biasa disebut Administrator.

python3 manage.py createsuperuser

Isi data yang diminta, terutama username dan password. Untuk username kalau dibiarkan kosong akan mengambil dari user linux Anda. Dan password harus terdiri dari minimal 8 karakter. Kalau tidak akan muncul seperti ini

cara membuat website

Sekarang kita sudah bisa login ke admin area dari django dengan alama 127.0.0.1/admin atau bisa dilihat rute pada file urls.py. Dan mengisi artikel pertama kita. Jangan lupa aktifkan dulu servernya dengan perintah python3 manage.py runserver

2.3) Bekerja di Admin Area

Ada yang belum dilakukan ini, models.py tidak terload pada admin area. Untuk itu tambahkan kode berikut ini supaya models.py bisa diload. Buka file admin.py yang berada di folder blog

from django.contrib import admin
from blog.models import Artikel

admin.site.register(Artikel)

from blog.models import Artikel untuk mengimpor models dari blog, kode ini hanya mengimpor Model Artikel saja.

admin.site.register(Artikel) yang ini mendaftarkan model Artike, dan maksimal hanya 3 saja. Kalau ada lebih dari 3 Model, maka bisa menggunakan kode yang 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)

Dengan kode di atas ini, setiap apapun model yang kita buat akan ada didaftarkan pada admin area. Sekarang kita sudah bisa membuat posting untuk artikel. Ok....👍️👍️👍️

Back to top

3) Relationships

Saya akan melakukan perubahan pada models.py yaitu menambah field gambar yang tadi belum kita buat. Lalu mengubah field penulis supaya tidak ketik manual, tapi ambil langsung dari nama yang sedang login atau nama user yang ada disistem myproject. Dan menambah tabel bernama kategori untuk Artikel kita yang akan diambil dengan cara dropdown.

Membuat tabel Kategori, kode ini diletakkan di atas (sebelum) class Artikel. Buka kembali file blog/models.py dan 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

Sebagian keterangan bisa dibaca kembali ke atas ya untuk field nama_kategori dan slug_kategori sudah bisa dipahami. Slug_kategori ini berguna nanti saat kita akan menampilkan seluruh tulisan dalam kategori tertentu, dan juga kalau saja Anda membuat kategori yang memiliki dua kata atau lebih.

class META: ini hanya untuk mengurutkan berdasarkan nama_kategori, dan selebihnya sama seperti yang ada di class Artikel

Untuk perubahan yang ada di class Artike adalah seperti ini

class Artikel(models.Model):
    from django.contrib.auth.models import User
    judul_post = models.CharField(max_length=200, unique=True)
    body_post = models.TextField()
    gambar_post = models.ImageField(upload_to='%Y/%m/%d')
    kategori_post = models.ForeignKey(Kategori, to_field='slug_kategori', on_delete=models.CASCADE, related_name='Category')
    penulis = models.ForeignKey(User, to_field='username', null=True, blank=True, on_delete=models.CASCADE, related_name='author')
    tanggal_post = models.DateTimeField(auto_now_add=True)
    slug_post = 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)

Ini adalah keterangan tambahan pada class Artikel

  • from django.contrib.auth.models import User mengambil seluruh data User yang ada di django.
  • gambar_post = models.ImageField(upload_to='%Y/%m/%d') membuat field untuk upload gambar yang akan disimpan difolder /media/tahun/bulan/tanggal, setting seperti ini akan dijelaskan caranya setelah ini.
  • kategori_post = models.ForeignKey(Kategori, to_field='slug_kategori', on_delete=models.CASCADE, related_name='Category') Field ini mengambil data dari tabel Kategori pada argumen pertama, defaultnya ke kolom ID tapi saya arahkan ke kolom slug_kategori menggunakan to_field, CASCADE berarti bahwa jika catatan dihapus maka apa yang terkait ditabel lain juga akan ikut dihapus.
  • Pada field penulis saya mengubahnya menjadi penulis = models.ForeignKey(User, to_field='username', null=True, blank=True, on_delete=models.CASCADE, related_name='author')
  • Selebihnya tidak ada perubahan.

Untuk membuat postingan artikel, sebelumnya buat dulu kategorinya agar bisa dipilih nanti saat membuat artikel.

Back to top

4) Media dan ImageField

Pada class Artikel kita sudah membuat field bernama gambar_post untuk mengupload gambar pada postingan artikel kita nanti. Field ini tidak berfungsi karena membutuhkan pustaka python bernama pillow. Untuk itu install juga menggunakan pip

pip3 install pillow

Setelah berhasil install pillow, buka file settings.py yang ada didirektori myproject dan tambahkan kode berikut:

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

Ini untuk memberitahukan kepada Django agar mengupload dan menyimpan file gambar di folder media.

Ok. Perubahan telah selesai dan kembali lakukan migrate untuk menuliskan kedatabase

python3 manage.py makemigrations
python3 manage.py migrate

Lihat di admin area, kita sudah menambah satu class model bernama Kategori dan tanpa melakukan register sudah otomatis teregistrasi berkat 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)

Kalau Anda masih menggunakan kode pertama tadi, baiknya ganti dengan kode seperti di atas ini pada file admin.py agar semua class model bisa otomatis terdaftar di Admin Area.

Dan ini full kode models.py setelah dilakukan perubahan

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

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):
    from django.contrib.auth.models import User
    judul_post = models.CharField(max_length=200, unique=True)
    body_post = models.TextField()
    gambar_post = models.ImageField(upload_to='%Y/%m/%d')
    kategori_post = models.ForeignKey(Kategori, to_field='slug_kategori', on_delete=models.CASCADE, related_name='Category')
    penulis = models.ForeignKey(User, to_field='username', null=True, blank=True, on_delete=models.CASCADE, related_name='author')
    tanggal_post = models.DateTimeField(auto_now_add=True)
    slug_post = 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)
Back to top

5) Cara Membuat Website Sendiri

Sebelumnya saya ingin menulis juga tentang class.based.views dihalaman ini, tapi ternyata untuk membahas models saja sudah cukup panjang tulisannya. Jadi pembahasan cara membuat website sendiri cukup dengan models saja dulu, selanjutnya akan dibahas tentang class based views dan perbedaannya dengan menggunakan function (def) view.

Back to top