Belajar Django: App

Apa itu app? umumnya app diartikan sebagai satu aplikasi utuh kan? Di django sedikit berbeda, di tulisan sebelumnya kita itu sedang membuat “projek”, di dalam projek misal kita akan membuat satu fitur blog post, maka di dalam “project” itu akan ditambahkan “app” blog. Jadi, di dalam satu “projek” bisa ada banyak “app”. Menariknya, “app” dalam django itu bersifat modular dan mandiri, bisa saja kita mengambil “app” dari “projek” satu dan memindahkan ke “projek” lainnya.

Mohon koreksinya ya jika salah.

MVC

Bagi yang sudah punya pengalaman di beberapa framework sepert laravel misalnya tentu tidak asing dengan konsep MVC, konsep yang memisahkan tanggung jawab ke masing-masing layer ( saya nyebutnya layer, saya gak tahu padanan yang enaknya apa ). Sederhananya MVC itu masing-masing memiliki tanggung jawabnya:

Model: Umumnya berfungsi sebagai penyambung dengan data/table di database.

View: Di framework seperti laravel view ini bertanggung jawab dalam urusan antar muka dengan user atau tampilannya, kode-kode html biasanya disimpan di sini.

Controler: Sesuai namanya controller adah tempat kita menyimpan kontrol atau logika aplikasi kita, meyambungkan tampilan (menerima request dari antar muka) lalu mengolahnya ( misal berkomuikasi dengan model) dan mengembalikan respon yang dibutuhkan.

App di django tidak berbeda jauh, hanya saja jika boleh memberi nama sendiri di django bisa disebut MVT

Model: Sama dengan umumnya bertanggung jawab berkomunikasi dengan db.

View: Berbeda dengan pengertian yang tadi view di sini berperan sebagai controller

Template: Di sinilah baru kita berurusan dengan antar muka.

Saya berencana tulisan tentang django ini dibagi dalam dua jenis, menggunakan Django untuk membuat aplikasi REST dan aplikasi web pada umumnya, untuk saat ini saya fokus dulu di yang REST

Membuat APP

Untuk membuat “app” di django kita bisa membuatnya dengan perintah:

python manage.py startapp blog

Perintah di atas saya membuat “app” dengan nama “blog”.

note: semua command line yang saya gunakan berada di root direktori

Di dalam direktori akan muncul seperti berikut:

.
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
└── restdjango
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Mendaftarkan APP

Setelah membuat app kita perlu mendaftarkan app, buka `restdjango/settings.py` lalu tambahkan “app” yang sudah dibuat

INSTALLED_APPS = [
    #app
    'blog.apps.BlogConfig',
    #default from django
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Model

Di sini saya akan membuat sebuah fitur blog post sederhana:

  1. Mempunyai 2 table kategori dan post
  2. Setiap kategori mempunyai banyak post
  3. Post memiliki status published true atau false

Mari buat databasenya, pertama buka berkas blog/models.py:

from django.db import models

# Create your models here.
class Category(models.Model):
    title=models.CharField(max_length=200)
    description=models.TextField()
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

class Post(models.Model):
    category_id=models.ForeignKey(Category, on_delete=models.CASCADE)
    title=models.CharField(max_length=200)
    content=models.TextField()
    publish=models.BooleanField(default=False)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

Di atas di dalam model saya membuat dua skema tabel, pertama tabel `Category` dengan memiliki dua atribut yaitu “title” dan “description”,  sedangkan di table `post ` memiliki “title”, “content”,”publis”, dan tentu saja “category_id” untuk menunjukan post ini berada di kategori mana saja.

Membuat Migration

Migration itu yang saya pahami membuat skema query sesuai dengan skema yang tadi dibuat di dalam model, untuk membuat migration cukup lakukan

python manage.py makemigrations blog

Muncul informasi sebagai berikut

Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Category
    - Create model Post

Setelah berkas migration dibuat, selanjutnya adalah menambahkan skema yang sudah kita buat ke dalam database, caranya dengan mengeksekusi perintah berikut:

python manage.py migrate

Muncul informasi

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

Admin

Agar “app” kita terdaftar di admin dashboard buka berkas `blog/admin.py` dan ubah menjadi seperti berikut:

from django.contrib import admin
from .models import Category, Post
# Register your models here.
admin.site.register(Category)
admin.site.register(Post)

Selanjutnya silahkan login ke halaman admin dan “app” yang tadi dibuat sudah terdaftar

Halaman “crud Category”

Halaman Post

Yang menarik adalah, kolom “category” langsung diubah menjadi “select list” karena merupakan relasi dari tabel “category” dan kolom “published” langsung berupa “checkbox”.

 

Referensi:

https://docs.djangoproject.com/en/2.2/intro/tutorial01/

https://docs.djangoproject.com/en/2.2/ref/models/fields/