kali ini kita akan belajar tentang django, django sendiri adalah web framework bahasa pemrograman python yang populer dan banyak digunakan, dengan framework ini kita bisa membuat website dengan cepat, karena sebagian besar keperluan untuk membuat web seperti TemplateView
dan fungsi lainya untuk membuat website sudah di cover dalam web framework ini.
Apa Yang Akan Dipelajari
dalam pembahasan kali ini kita akan mempelajari
- Membuat Virtual Environtment Menggunakan Python
- Instalasi Django
- Membuat Project dan Django dan Konfigurasinya
- Membuat Django Application (Studi Kasus Blog)
- Mendesain Model
- Membuat Template dari Bootstrap 5
- Mendesain View Menggunakan Class Base View
memang cukup pajang pembahasan kali ini karena kita akan membuat project Blog menggunakan Django, yuk langsung saja ke pembahasanya
Persiapan Projects
ada beberapa hal yang harus disiapkan untuk membuat project ini diantaranya adalah
pastikan sudah mempunyai text editor pada studi kasus kali ini saya akan menggunakan pycharm, pastikan juga sudah mempelajari Python Fundamental dam OOP menggunakan python
Membuat Virtual Environtment
untuk menghindari include library yang diperlukan kita perlu membuat virtual environtment untuk isolasi package dan python lihat bagian Apa itu Virtualenv, cara membuatnya simple cukup dengan perintah
python3 -m venv django-simple-blog_venv
perintah ini digunakan untuk membuat virtual environtment dengan nama django-simple-blog_venv
Mengaktifkan Virtual Environtment
ada 2 cara mengaktifkanya yaiti cara mengaktifkan virtual environtment di windows dan di Linux/OSX
- Windows
kita bisa menggunakan perintah
django-simple-blog_venv/Scripts/activate
- Linux/OSX
sedangkan jika menggunakan linux atau OSX bisa menggunakan perintah
source django-simple-blog_venv/bin/activate
jika sudah aktif maka akan terlihat seperti ini
Instalasi Django
untuk instalasi django kita bisa lihat di dokumentasi kita dapat menginstall menggunakan pip, untuk perintahnya sudah tersedia di PYPI http://pypi.org/, kita bisa menggunakan perintah
pip install django
dengan perintah ini kita bisa menginstall django versi terbaru, yaitu versi 3.1
Note: versi django tersebut adalah versi terbaru saat postingan ini dibuat, versi django ini hanya kompartibel dengan versi python 3 (versi 3.6+)
Membuat Project
kita akan membuat project dengan perintah
django-admin startproject simple_web .
perintah ini akan membuat project direktori di direktori aktif saat ini ketika ditambahkan tanda .
agar tidak membuat directori baru kerika membuat project
jika sudah membuat project strukturnya akan seperti ini
Menjalankan Server Development
untuk menjalankan server development pada django bisa dengan perintah
python manage.py runserver
maka hasilnya akan seperti ini
Membuat Apps Django
sekarang kita akan membuat Django Apps
mah dalam kasus ini kita akan membuat aplikasi Blog
dari 0, dari direktori projects masikan perintah
python manage.py startapp blog
perintah ini akan membuat folder apps django yang bernama blog
struktrunya akan seperti ini
blog/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
sekarang mari kita bahas satu satu apa kegunaan file diatas
- __ init__.py
- admin.py
- apps.py
- migrations
- models.py
- tests.py
- views.py
Mengaktifkan Aplikasi
setelah selesai membuat aplikasi kita perlu mendaftarkan aplikasi django yang baru saja kita buat agar dikenali oleh django, kita meng inisialisasinya pada INSTALLED_APPS
di file settings.py
yang berada pada root project kita, seperti ini
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # folder aplikasi yang didaftarkan
]
Note: kamu juga bisa mendaftarkan aplikasi mu dengan format seperti ini
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog.apps.BlogConfig ', # folder aplikasi yang didaftarkan ]
dimana
blog.apps.BlogConfig
didapat dari class yang berada di fileapps.py
isi dari file tersebut seperti ini
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
setelah selesai menginisialisasi, kita lanjut ke step selanjutnya yaitu mendesain model
Mendesain Model
pada tahap ini kita akan mendesain model untuk aplikasi kita, kita akan merancang data schema dengan mendefinisikan model dalam blog/models.py
pada aplikasi kita, buka file models.py
yang ada dalam folder blog
kemudian isi seperti ini
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
# status params
STATUS = (
(0, 'Draft'),
(1, 'Publish'),
)
# created models
class Posts(models.Model):
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_post')
contents = models.TextField()
created_on = models.DateTimeField(auto_now=True)
status = models.IntegerField(choices=STATUS, default=0)
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
Pembahasan Models
setelah menulis model diatas mari bahas apa sih yang yang ditulis mari kita bahsa satu satu
title
: adalah field berisiCharField
yang akan diterjemahkan keVARCHAR
dalam SQLslug
: digunakan untuk mempercantik URL supaya SEO frendlyauthor
: adalah relasi dari table user yang bersifatOne-to-Many
maksudnya adalah 1 autor bisa menulis banyak post
Note: Bahasan Lebih Lanjut Mengenai Author, kita bisa lihat bentuk dari Field Modelnya yang bebentuk
ForeignKey
seperti inimodels.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_post')
nah dalam model
Posts
ini kita mempunyai relasi ke table Users yang maa kita import daridjango.contrib.auth.models
bawaan django sehingga kita bisa akses nilai field dari modelsUsers
ke modelsPosts
yang kita buat
contents
: adalah field yang akan kita gunakan untuk menyimpan postingan kita dapat kita lihat bahwa dia bernilaiTextField
yang akan diterjemahkan menjadiTEXT
dalam SQLcreated_on
: adalah field yang berisi waktu yang akan digunakan untuk menyimpan data waktu postingan itu dibuat, disini kita menggunakan method django yang bernamatimezone
untuk mengetahui waktu dan untuk menambahkan secara otomatis kita bisa menambahkan attributauto_now
atauauto_now_add
status
: digunakan untuk menentukan pilihan apakah mau dipublish
ataudraft
suatu postingan
Note: pada field status kita dapat menggunakan parameter
choices
untuk meentukan pilihan berdasarkan nilai sudah ditentukan contoh# status params STATUS = ( (0, 'Draft'), (1, 'Publish'), ) # penerapan pada models status = models.IntegerField(choices=STATUS, default=0)
Melakukan Migrasi dan Menerapkan pada Database Django
setelah membuat model kita perlu menerapkanya pada database dengan cara melakukan migrasi, nah cara melakukan migrasi di django kita cukup menggunakan perintah
python manage.py makemigrations
perintah ini akan melakukan inisialisasi pada database kita seperti ini
nah setelah melakukan inisialisasi terapkan perubahan pada database dengan perintah
python manage.py migrate
maka proses nya akan terlihat seperti ini
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying blog.0001_initial... OK
Applying blog.0002_auto_20210317_1612... OK
Applying sessions.0001_initial... OK
Registrasi Model ke Admin
tahap selanjutnya setelah membuat model adalah melakukan registrasi Model ke Admin Agar Bisa diakses melalui Dashboard Bawaa Django, cara registrasinya seperti ini
from django.contrib import admin
from blog.models import Posts
# config panel admin for posts model
class PostsAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'status', 'created_on')
list_filter = ("status", )
search_fields = ['title', 'contents']
prepopulated_fields = {'slug': ('title', )}
# Register your models here.
admin.site.register(Posts, PostsAdmin)
oke sekarang kita akan kupas satu satu apa sih yang baru saja kita tulis mari kita bahas 1 per satu
class PostsAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'status', 'created_on')
list_filter = ("status", )
search_fields = ['title', 'contents']
prepopulated_fields = {'slug': ('title')}
adalah konfigurasi untuk admin panel kita contoh disini kita ada
list_display
: di gunakan untuk mengatur field apa saja yang akan ditampilkan di dashboardlist_filter
: yaitu terkait dengan filterisasi field yang akan ditampilkansearch_fields
: pengaturan pencarianprepopulated_fields
: digunakan untuk mengatur pengelompokan antar field dalam dashboard
setelah mengetahui itu semua kita bisa registrasi model nya menggunakan admin.site.register
seperti ini
admin.site.register(Posts, PostsAdmin)
Membuat Username dan Password
lanjut ke langkah berikutnya kali ini kita akan membuat username dan password untuk mengamankan dashboard admin yang kita punya kita cukup dengan perintah
python manage.py createsuperuser --username="admin" --email="admin@django.id"
dimana admin
adalah username yang akan kita gunakan untuk login, setelah menjalankan perintah diatas outputnya akan seperti ini
output diatas terjadi karena saya menggunakan password admin
sekarang mari kita lihat model yang sudah kita registrasi pada step sebelumnya sekarang sudah bisa diakses di dashboard pada url http://localhost:8000/admin/login/?next=/admin/ seperti ini
login menggunakan username dan password yang dibuat tadi setelah itu kita akan diarahkan ke halaman utama dashboard seperti ini
sekarang coba click posts untuk membuat postingan baru atau bisa klik url http://localhost:8000/admin/blog/posts/add/
Membuat Postingan Pertama
setelah itu coba isi postinganya misal saja seperti ini
kemudian klik save
hasilnya seperti ini
Sekilas Tentang View
setelah membuat model, membuat user, sekarang kita akan membuat view django, yap ini adalah bagian yang paling vital disini kita akan membuat dan menempatkan logika di aplikasi kita dalam file views.py
disini akan dibahas sedikit tentang apa itu Views
- Class Based Views
class based view adalah views yang dibuat menggunakan class (Class Based) sehingga lebih praktis dan reusable (Dapat digunakan Ulang). django sendiri telah menyediakan class based view bawaan sehingga mempermudah dan mempercepat proses development, lebih lengkap tentang class based view bisa dilihat disini https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/
untuk penggunaan dan penerapanya bisa mengunjungi website ini https://ccbv.co.uk/
- Function based View
adalah kebalikan dari Class Based View yaitu view yang dibuat berbasis fungsi contohnya seperti ini
membuat listview
menggunakan fungsi
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.published.all()
return render(request, 'blog/post/list.html', {'posts': posts})
membuat post_detail
menggunaka fungsi
def post_detail(request, year, month, day, post):
post = get_object_or_404(Post, slug=post, status='published', publish__year=year, publish__month=month publish__day=day)
return render(request,'blog/post/detail.html', {'post': post})
kelebihan dari membuat view seperti ini kita bisa mengerti betul dan dapat kita custom dengan mudah.
Kapan Kita Harus Menggunakan Class Based View atau Function Based View
setelah mengetahui jenis-jenis views pada django kapan kita harus menggunakan class atau function based view jawabanya ada 3 berdasarkan pengalaman pribadi
- Sesuai Kasus yang sedang dikerjakan
- Deadline Projects
- Fleksibilitas (kerapian kode dan fungsionalitas program)
kita bahas satu per satu
Sesuai Kasus yang dikerjakan
kadang ketika kita dapat project yang dimana project itu skalanya menengah sampai besar kita dapat menggunakan class based view untuk mempercepat proses development, jika sebaliknya kita bisa menggunakan function based view
Deadline Projects
deadline menjadi salah satu hal yang membuat kita kalang kabut untuk mengerjakan sebuah project :) yap disini kita juga dapat menjadikan acuan bagaimana kita membuat suatu logika dalam pengembangan aplikasi dengan memperhatikan juga skala dan waktu pengerjaan project.
Fleksibilitas Aplikasi
fleksibilitas disini maksudnya adalah kerapian dan fungsionalitas penerapan logika pada suatu aplikasi, dalam kasus tertentu kita bisa membuat class based view dan function based view secara bersamaan untuk handle fungsi atau fitur yang tidak disediakan oleh class based view misalnya dapat kita ganti atau kombinasikan dengan fungsi, atau kita bisa custom class nya sesuai kebutuhan.
Membuat Views dengan Class Based Views
pada studi kasus kali ini kita akan menggunakan class based views untuk blog yang akan kita buat, pertama buat file views.py
dalam direktori blog
lalu isi seperti ini
from django.views import generic
# import models
from .models import Posts
# Create your views here.
class PostsListView(generic.ListView):
queryset = Posts.objects.filter(status=1).order_by('created_on')
template_name = 'blog/index.html'
class PostsDetailView(generic.DetailView):
model = Posts
template_name = 'blog/posts_detail.html'
disini kita menggunakan class generic
pada views cek di https://docs.djangoproject.com/en/3.2/topics/class-based-views/generic-display/ atau ke https://ccbv.co.uk/
dalam class generic
ini sudah ada views bawaan jadi kita tinggal pake saja, untuk membuat views secara mudah dan code menjadi lebih simple.
Menambah URL pattern untuk views (membuat route)
pada tahap ini kita kan menambahkan URL Patterns
agar views yang tadi kita buat dapat diakses dan ditampilkan di browser, langkah pertama buat file urls.py
dalam direktori blog
kemudian isi seperti ini
from . import views # import views
from django.urls import path
# posts urls route
urlpatterns = [
path('', views.PostsListView.as_view(), name='posts'),
path('<slug:slug>/', views.PostsDetailView.as_view(), name='posts_detail'),
]
dimana pada pembuatan urlpatterns
ini kita perlu import views yang tadi kita buat kemudian agar views dapat ditampilkan dan di eksekusi kita dapat menggunakan method as_view()
Templating (Membuat Template)
yap coba kita lihat lagi pembuatan views di views.py
ada paremeter yang namanya template_name
disetiap class pada views
yap itu adalah template html yang akan kita buat, langkah pertama tambahkan templates dalam settings.py
seperti ini
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
selanjutnya buat file base.html
, direktori partials
, dan index.html
serta file lainya seperti hirarki ini
blog/templates
└── blog
├── base.html
├── index.html
├── partials
│ └── navbar.html
└── posts_detail.html
kemudian kita membuat satu per satu file htmlnya seperti ini
Template utama (base.html)
file ini akan menjadi template induk dari file file lainya artinya menjadi turunan-turunan dari file lain dalam file ini kita membuat sebuah template dasar (blueprint) dari suatu template
{% load static %}
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
<title>{% block titles %} {% endblock titles %} - Simple Blog</title>
</head>
<body>
{% block contents %}
{% endblock contents %}
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>
<!-- footer -->
<footer class="py-3 bg-grey">
<p class="m-0 text-dark text-center ">Copyright © My Website</p>
</footer>
</body>
</html>
Pecahan Perbagian (partials)
pada tahap ini kita akan membuat pretelan (pecahan) bagian-bagian template agar menjadi lebih ter struktur
dalam kasus ini kita akan memecah bagian navbar saja (partials/navbar.html
)
<nav class="navbar navbar-expand-lg navbar-darj bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="{% url 'posts' %}">My Website</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="{% url 'posts' %}">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'posts' %}">Blog</a>
</li>
</ul>
</div>
</div>
</nav>
Membuat Halaman Utama (index.html)
selanjutnya kita membuat template untuk halaman utama yang akan kita turunkan dari base.html
sebagai template induknya seperti ini
{% extends 'blog/base.html' %}
{% load static %}
{% block titles %}
Blog
{% endblock titles %}
{% block contents %}
<link rel="stylesheet" href="{% static 'css/blog_style.css' %}">
{% include "blog/partials/navbar.html" %}
<div class="container">
<div class="row">
<!-- Blog Entries Column -->
<div class="col-md-8 mt-3 left">
{% for post in posts_list %}
<div class="card mb-4">
<div class="card-body">
<h2 class="card-title">{{ post.title }}</h2>
<p class="card-text text-muted h6">{{ post.author }} | {{ post.created_on}} </p>
<p class="card-text">{{post.content|slice:":200" }}</p>
<a href="{% url 'posts_detail' post.slug %}" class="btn btn-primary">Read More →</a>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock contents %}
hasilnya seperti ini
Membuat Halaman untuk Menampilkan Detail Postingan
selanjutnya agar postingan kita dapat dibaca kita perlu membuat halaman detail seperti ini
{% extends "blog/base.html" %}
{% block titles %}
{{ object.title}}
{% endblock titles %}
{% block contents %}
{% include "blog/partials/navbar.html" %}
<div class="container">
<div class="row">
<div class="col-md-8 card mb-4 mt-3 left top">
<div class="card-body">
<h1>{{ object.title }}</h1>
<p class="text-muted">{{ object.author }} | {{ object.created_on }}</p>
<p class="card-text ">{{ object.contents | safe }}</p>
</div>
</div>
</div>
</div>
{% endblock contents %}
Conclusion
sampai disini dulu pembahasan project django kali ini, semoga bermanfaat dan selamat mencoba, link repo project dapat di akses dan di download di gitlab dibawah ini :)