Membangun Aplikasi Mini HRD dengan Django (1): Pengenalan Django Admin

Ridwan Fajar 2 Juni 2016

Membangun Aplikasi Mini HRD dengan Django (1): Pengenalan Django Admin

Django merupakan salah satu fullstack web framework yang populer di kalangan programmer Python. Keunggulannya terletak pada beragamnya dukungan terhadap berbagai database baik itu relasional maupun non relasional. Secara default, Django mendukung database relasional seperti PostgreSQL, SQLite, MySQL, dan Oracle. Django memiliki segudang fitur built-in yang dapat membantu Anda lebih mudah untuk membangun aplikasi. Beberapa fitur yang menjadi Andalan Django adalah:

  • Sistem autentikasi built-in
  • Object relational mapper
  • Built-in template engine
  • Form dan ModelForm
  • Administrator page
  • Migration tool
  • Command-line tool
  • dan masih banyak lagi
Django sendiri memiliki konsep MVT mungkin bisa dibilang mirip dengan MVC tapi sebenarnya agak berbeda:
  • Model adalah file yang berisi class untuk menggambarkan sebuah tabel pada database
  • Views adalah kumpulan function di dalam suatu modul yang akan memproses request dan memberikan response, sama halnya seperti controller di MVC
  • Template adalah file yang berisi HTML dan tidak ada kode Python di dalamnya, sama halnya seperti views di MVC
Kali ini kita akan membuat sebuah aplikasi untuk human resource department tapi dalam skala yang sangat kecil. Kita akan batasi aplikasi ini pada fitur seperti berikut:
  • Mengelola pengguna sistem
  • Mengelola data divisi dan jabatan
  • Mengelola data karyawan
  • Mengelola data kehadiran
  • Membuat halaman untuk karyawan untuk melihat daftar hadir dan pengajuan cuti
Di tutorial ini, empat fitur pertama akan diselesaikan di tutorial ini, dan poin terakhir akan dibahas di tutorial berikutnya secara lebih mendalam di mana kita akan mengenal berbagai hal seputar membangun aplikasi web menggunakan Django. Mari kita ikuti terlebih dahulu tutorial bagian pertama ini.

Instalasi Django dan Python

Django dapat dipasang di berbagai sistem operasi seperti Windows, Mac OSX, Linux, dan BSD varian. Untuk pengguna Windows Anda dapat menggunakan installer .exe untuk Python, PIP, dan Django. Ingat, Python yang digunakan di tutorial ini adalah versi 2.7.x ke atas. Sedangkan untuk pengguna OSX umumnya tersedia dalam Brew atau installer tersendiri. Anda dapat mencari installer PIP, Python, dan Django untuk OSX. Sedangkan untuk pengguna Linux dan BSD mungkin agak lebih mudah proses instalasinya karena sudah disediakan repositori masing - masing sistem operasi. Berikut adalah cara install Django di Linux dan BSD.

Cara install di Ubuntu:

$ sudo apt-get install pip
$ sudo pip install django

Cara install di Fedora:

$ sudo yum install pip
$ sudo pip install django

Install dari source code Django (untuk pengguna BSD atau Linux lainnya):

$ tar -xzvf django-1.9.x.tgz
$ cd django-1.9.x
$ python setup.py install

Bila sudah berhasil memasang Django di sistem operasi Anda, cobalah buka konsol / terminal untuk mencoba Django dengan perintah seperti berikut:

$ django-admin.py --version
1.9.x

Membuat Proyek Baru

Untuk membuat proyek baru di Django cukup mudah. Berbeda dengan beberapa web framework yang bisa digunakan setelah mengunduh source code-nya, installer Django disimpan di sistem operasi untuk kemudian lagi di-update versinya bila diperlukan. Hanya dengan menggunakan django-admin.py di konsol kita dapat membuat sebuah proyek Django baru. Untuk tutorial ini silahkan simpan saja di folder manapun yang Anda sukai, kemudian panggil perintah berikut untuk membuat proyek baru:
$ django-admin.py startproject mini_hrd
Sekarang kita coba lihat ada apa sajakah di dalam sebuah proyek Django yang baru lahir:
$ cd mini_hrd/
$ ls mini_hrd
manage.py mini_hrd
$ ls mini_hrd/mini_hrd
__init__.py   settings.py   urls.py   wsgi.py
Di dalam proyek baru Django ada beberapa file yang perlu dikenali:
  • manage.py merupakan file yang akan menjadi jembatan untuk menggunakan perintah konsol yang dimiliki Django, ada cukup banyak perintah konsol yang dimiliki Django seperti membuat modul baru, meng-generate database dari ORM ke RDBMS, dan lainnya
  • mini_hrd/ _ _ init _ _ .py merupakan sebuah file yang menjadi penanda bagi sebuah direktori di dalam proyek aplikasi agar dikenali Python dan dapat terlibat dalam proses import modul dan file. Cocok sekali bila kita terbiasa membuat sebuah aplikasi terbagi menjadi beberapa file atau modul
  • mini_hrd/settings.py merupakan file yang berisi pengaturan Django mulai dari pengaturan database, pengaturan dimana file statik seperti CSS dan Javascript berada, pengaturan aplikasi atau sistem yang terintegrasi dengan aplikasi Django, dan berbagai pengaturan lainnya
  • urls.py merupakan file yang berisi pemetaan URL ke views atau modul yang ada di dalam Django, misal ketika kita ingin mengakses http://localhost:8000/about maka kita akan diarahkan ke urls.py kemudian dia akan melihat views mana yang akan memproses request tersebut, misal nama views-nya adalah homepage.views.about
  • wsgi.py merupakan file yang akan digunakan ketika akan melakukan proses deploy aplikasi Django di web server seperti Apache atau Nginx
Setelah mengenal beberapa file yang ada di Django kita akan menggunakan database SQLite3 terlebih dahulu untuk memulai pembangunan aplikasi mini HRD kita. Berikut adalah contoh konfigurasi SQLite3 yang ada di mini_hrd/settings.py:
...............

WSGI_APPLICATION = 'mini_hrd.wsgi.application'

Database

https://docs.djangoproject.com/en/1.9/ref/settings/#databases

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }

...............

Pada konfigurasi database SQLite3 diatas, kita akan menyimpan file database di folder proyek. Sekarang kita akan melakukan migrasi database untuk pertama kali dan ini hukumnya wajib bila kita ingin menggunakan halaman admin Django:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, contenttypes, auth, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... 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 sessions.0001_initial... OK

Pada output diatas Anda dapat melihat bahwa Django membuat beberapa tabel yang akan digunakan untuk mengelola user, group, dan keperluan administrasi Django. Sekarang kita akan membuat super user yang akan digunakan untuk mengakses halaman Django Admin. Di dalam percobaan ini Anda dapat memasukkan username yang Anda mau ata membiarkannya dinamai oleh Django kemudian memasukkan sebuah email yaitu "ridwanbejo@gmail.com" dan sebuah password yaitu "ridwanfajar":

$ python manage.py createsuperuser
Username (leave blank to use 'ridwanfajar'): 
Email address: ridwanbejo@gmail.com
Password: 
Password (again): 
Superuser created successfully.

Selamat Anda berhasil membuat sebuah super user untuk aplikasi Django kita, tapi kita harus mencoba menjalankannya di server dan melihatnya di web browser. Beruntunglah bagi pengguna Django karena dia sudah menyediakan sebuah built-in webserver untuk digunakan sebagai proses development. Anda dapat menjalankan Django untuk melihat Django pertama kali dengan perintah runserver:

$ python manage.py runserver

Sekarang cobalah buka web browser Anda dan silahkan akses URL http://localhost:8000/ dan http://localhost:8000/admin/:

Selection_009 Selection_010

Selamat Anda akhirnya berhasil membuat sebuah aplikasi Web Django untuk pertama kali. Sekarang kita coba akses halaman admin dengan menggunakan akun super user yang telah kita buat kemudian setelah berhasil login Anda akan melihat sebuah halaman yang telah berisi dua menu yaitu Groups dan Users:

Selection_001 Selection_002

Sebelum menjelajah ke langkah selanjutnya, sekarang mari kita mengintip terlebih dahulu halaman mengelola users yang ada di Django Admin:

Selection_004 Selection_003

OK, akhirnya poin pertama dari objektif kita di tutorial ini sudah beres. Mari kita bergerak ke quest berikutnya :D.

Membuat Modul Karyawan dan Kehadiran

Di dalam aplikasi Mini HRD ini kita akan membuat modul kehadiran dan karyawan. Modul dapat diartikan sebagai folder yang berisi file - file Django seperti model, views, dan template. Untuk membuat sebuah modul diperlukan perintah startapp dengan melewatkan nama modul yang akan dibuat. Perhatikan perintah dibawah ini:
$ python manage.py startapp karyawan
$ python manage.py startapp kehadiran
Kemudian setelah berhasil membuat kedua modul tersebut, kita harus mendaftarkannya di mini_hrd/settings.py agar modul tersebut dapat dilibatkan dalam proses migrasi database dan dapat ditampilkan di halaman admin Django:
.............

SECURITY WARNING: don't run with debug turned on in production!

DEBUG = True

ALLOWED_HOSTS = []

Application definition

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'kehadiran', 'karyawan', ]

.............

Mari kita lanjut ke tahap berikutnya, kita akan membuat empat class model di dalam karyawan/models.py. Class tersebut terdiri dari Divisi, Jabatan, Karyawan, dan Akun. Di dalam sebuah file model wajib terdapat sintaks from django.db import models yang artinya kita memanggil modul models yang tersedia di Django. Setiap class model akan diturunkan dari sebuah class models.Model. Di dalamnya akan terdapat pendefinisian field tabel dan berbagai function yang akan dimiliki class tersebut. Sekarang silahkan salin terlebih dahulu source code berikut ke karyawan/models.py:

from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Divisi (models.Model):
    nama = models.CharField(max_length=100)
    keterangan =models.TextField(blank=True)

    def __unicode__(self):
        return self.nama

class Jabatan (models.Model):
    nama = models.CharField(max_length=100)
    keterangan = models.TextField(blank=True)

    def __unicode__(self):
        return self.nama

class Karyawan (models.Model):
    JENIS_KELAMIN_CHOICES = (
        ('pria', 'Pria'),
        ('wanita', 'Wanita'),
    )

    JENIS_KARYAWAN_CHOICES = (
        ('magang', 'Magang'),
        ('kontrak', 'Kontrak'),
        ('tetap', 'Tetap'),
    )

    nama = models.CharField(max_length=100)
    alamat = models.TextField(blank=True)
    jenis_kelamin = models.CharField(max_length=10, choices=JENIS_KELAMIN_CHOICES)
    jenis_karyawan = models.CharField(max_length=10, choices=JENIS_KARYAWAN_CHOICES)
    no_telepon = models.CharField(max_length=30, blank=True)
    email = models.CharField(max_length=100, blank=True)
    no_rekening = models.CharField(max_length=100)
    pemilik_rekening = models.CharField(max_length=100)
    divisi = models.ForeignKey(Divisi)
    jabatan = models.ForeignKey(Jabatan)

    def __unicode__(self):
        return self.nama

class Akun (models.Model):
    JENIS_AKUN_CHOICES = (
        ('karyawan', 'Karyawan'),
        ('admin', 'Administrator'),
    )

    akun = models.ForeignKey(User)
    karyawan = models.ForeignKey(Karyawan)
    jenis_akun = models.CharField(max_length=20, choices=JENIS_AKUN_CHOICES)

    def __unicode__(self):
        return self.karyawan.nama

Ada beberapa hal yang perlu diperhatikan dari kode diatas:

  • Setiap model dideklarasikan dengan sebuah class Python yang mewarisi models.Model
  • Nama model disesuaikan dengan kebutuhan Anda
  • Untuk membuat sebuah kolom bertipe Varchar, digunakan CharField
  • Untuk membuat sebuah kolom bertipe Text, digunakan TextField
  • Parameter max_length digunakan untuk menentukan batas maksimal string yang akan disimpan
  • Parameter blank digunakan agar dapat mengizinkan kolom diisi dengan string kosong
  • Parameter null digunakan agar dapat mengizinkan kolom tidak diisi dengan nilai apapun
  • Function unicode digunakan untuk mencetak nama baris tabel ketika dengan output sementara yang kita tentukan. Bila tidak diatur, maka ketika ditampilkan di halaman Admin akan dicetak string seperti Karyawan object
  • Parameter choices akan membuat sebuah kolom menjadi tipe enum, untuk membuat sebuah CharField menjadi enum Anda harus melewatkan sebuah tuple yang berisi pilihan tersebut.
  • Untuk membuat sebuah relasi di class model Django, Anda hanya perlu menentukan sebuah field yang akan menjadi ForeignKey untuk tabel tersebut terhadap tabel parent. Parameter wajib dari field ForeignKey ini adalah nama tabel yang akan menjadi parent
Cukup banyak yah hal yang harus diperhatikan, tapi kita baru saja mendefinisikan tabel dalam class model. Sekarang saatnya kita akan menampilkan model tersebut menjadi sebuah "halaman khusus" di halaman admin Django. Silahkan salin source code berikut ke karyawan/admin.py:
from django.contrib import admin
from karyawan.models import *

Register your models here.

class DivisiAdmin (admin.ModelAdmin): list_display = ['nama', 'keterangan'] list_filter = () search_fields = ['nama', 'keterangan'] list_per_page = 25

admin.site.register(Divisi, DivisiAdmin)

class JabatanAdmin (admin.ModelAdmin): list_display = ['nama', 'keterangan'] list_filter = () search_fields = ['nama', 'keterangan'] list_per_page = 25

admin.site.register(Jabatan, JabatanAdmin)

class KaryawanAdmin (admin.ModelAdmin): list_display = ['nama', 'alamat', 'jenis_kelamin', 'jenis_karyawan', 'jabatan', 'divisi', 'email', 'no_telepon'] list_filter = ('jenis_kelamin', 'jenis_karyawan', 'jabatan', 'divisi') search_fields = ['nama', 'alamat', 'email', 'no_telepon'] list_per_page = 25

admin.site.register(Karyawan, KaryawanAdmin)

class AkunAdmin (admin.ModelAdmin): list_display = ['akun', 'karyawan', 'jenis_akun'] list_filter = ('jenis_akun',) search_fields = [] list_per_page = 25

admin.site.register(Akun, AkunAdmin)

Karena kita ingin mengelola tabel Divisi, Jabatan, Karyawan, dan Akun di halaman admin Django, maka kita harus mendaftarkan setiap tabel di file karyawan/admin.py dengan menggunakan sintaks admin.site.register(). Pada kode diatas ada yang sedikit berbeda, parameter kedua adalah sebuah class ModelAdmin yang berguna untuk mengubah tampilan halaman django admin saat memasuki halaman yang berkaitan dengan tabel. Ada beberapa hal yang harus diperhatikan dari kode diatas:

  • Setiap class tampilan Admin harus mewarisi class admin.ModelAdmin
  • list_display harus diisi dengan field yang ada di model, opsi ini berguna untuk menampilkan field apa sajakah yang akan ditampilkan ketika memasuki halaman suatu model. Field yang dapat ditampilkan adalah field yang hanya berisi satu nilai
  • list_filter harus diisi dengan field yang berupa relasi ke tabel lain atau berupa enum
  • search_fields harus diisi dengan field yang berisi satu nilai
  • list_per_page harus diisi dengan angka yang menjadi batas penampilan data suatu tabel
Tidak berbeda jauh dengan yang kita lakukan sebelumnya, di kehadiran/models.py akan kita isi dengan class model yang akan berisi kehadiran setiap karyawan. Silahkan salin kode berikut ke kehadiran/models.py:
from __future__ import unicode_literals

from django.db import models from karyawan.models import Karyawan

Create your models here.

class Kehadiran(models.Model): JENIS_KEHADIRAN_CHOICES = ( ('izin', 'Izin'), ('cuti', 'Cuti'), ('alpa', 'Tanpa Alasan'), ('hadir', 'Hadir'), )

karyawan = models.ForeignKey(Karyawan)
jenis_kehadiran = models.CharField(max_length=20, choices=JENIS_KEHADIRAN_CHOICES)
waktu = models.DateField()

def __unicode__(self):
    return self.karyawan.nama

Jangan lupa, kita harus menampilkannya di halaman admin Django. Silahkan salin kode berikut ke file kehadiran/admin.py:

from django.contrib import admin
from kehadiran.models import Kehadiran

# Register your models here.
class KehadiranAdmin (admin.ModelAdmin):
    list_display = ['karyawan', 'jenis_kehadiran', 'waktu']
    list_filter = ('jenis_kehadiran',)
    search_fields = []
    list_per_page = 25

admin.site.register(Kehadiran, KehadiranAdmin)

Setelah rampung menyalin dan memahami kode diatas, saatnya migrasi database karena ada penambahan model yang akan berimbas pada penambahan tabel di database yang telah kita atur. Silahkan eksekusi perintah python manage.py makemigrations untuk menelusuri perubahan apa sajakah yang harus dilakukan. Kemudian setelah Anda membaca output yang dikeluarkan, silahkan lanjut dengan mengeksekusi perintah python manage.py migrate untuk membuat tabel dan perubahan apapun terhadap database:

$ python manage.py makemigrations
Migrations for 'kehadiran':
  0001_initial.py:
    - Create model Kehadiran
Migrations for 'karyawan':
  0001_initial.py:
    - Create model Akun
    - Create model Divisi
    - Create model Jabatan
    - Create model Karyawan
    - Add field karyawan to akun

$ python manage.py migrate
Operations to perform:
  Apply all migrations: kehadiran, sessions, admin, karyawan, contenttypes, auth
Running migrations:
  Rendering model states... DONE
  Applying karyawan.0001_initial... OK
  Applying kehadiran.0001_initial... OK

Menarik bukan? Anda tidak harus membuat file migrasi sendiri, karena cukup dengan mengubah file models.py di suatu modul, maka Django akan membuatkan file migrasi untuk Anda. Tapi pada suatu saat mungkin Anda harus mengedit file migrasi bila ada masalah yang mendesak. Sekarang mari kita lihat hasilnya dengan menjalankan web server Django dan melihat halaman admin Django di web browser.

Selection_005

Selamat Anda berhasil membuat modul baru dan mendaftarkannya ke halaman admin Django. Mari kita lanjutkan perjalanan kita berikutnya.

Menggunakan Halaman Admin Django - Mengelola Divisi dan Jabatan

Tak enak rasanya apabila kita tidak mencoba langsung modul yang telah kita pasang di halaman admin Django. Mari kita awali dengan mengeloa data divisi terlebih dahulu. Ketika Anda mengklik halaman divisi, Anda akan melihat sebuah tombol Add Divisi dan kolom search serta sebuah filter yang berada di sebelah kanan. Kolom search muncul karena kita mengatur search_fields di class ModelAdmin yang kita lewatkan saat mendaftarkan model Divisi. Begitupun dengan filter, dia muncul karena kita mengaturnya di class ModelAdmin yang telah kita tulis. Kemudian Anda pun dapat melihat sebuah opsi "Action" yang dapat melakukan proses bulk terhadap baris tabel yang dipilih. Selection_014

Ketika Anda mengklik tombol Add Item maka Anda akan melihat tampilan yang kurang lebih seperti pada gambar berikut

Selection_015

Begitupun dengan jabatan, tampilannya tidak berbeda jauh karena kita mendefinisikan field yang sama pada class Model Jabatan:

Selection_016 Selection_001

Menggunakan Halaman Admin Django - Mengelola Karyawan dan Akun

Selanjutnya kita akan mencoba menambahkan karyawan baru, silahkan tekan tombol "Add Karyawan" ketika memasuki halaman Karyawan. Selection_011 Selection_017

Sekarang kita dapat melihat ada satu karyawan baru yang telah dicatat oleh aplikasi mini HRD kita.

Selection_022

Karena nantinya, Karyawan tersebut ingin melihat data kehadirannya dan juga melakukan pengajuan cuti, maka kita perlu membuatkan akun terlebih dahulu dan menghubungkannya ke data karyawan tersebut. Kita dapat menambah akun baru di halaman User, dan menghubungkannya dengan data karyawan melalui halaman Akun.

Selection_019 Selection_020 Selection_018 Selection_021 Selection_023

Menggunakan Halaman Admin Django - Mengelola Kehadiran Karyawan

Selanjutnya demo yang terakhir kita akan mencatat data kehadiran dari karyawan tersebut sesuai dengan hitungan hari kerja yang berlaku. Anda dapat mulai mengisi kehadiran karyawan tersebut pada tanggal tertentu dan memilih jenis kehadiran seperti sakit, izin, cuti, bolos, dan hadir. Selection_025

Sekarang Anda dapat melihat data kehadiran dari karyawan tersebut berdasarkan tanggal tertentu di halaman admin Django.

Selection_024

Penutup

Dengan menggunakan Django, Anda dapat membuat aplikasi yang dapat digunakan untuk mengejar kebutuhan awal terlebih dahulu. Sehingga data dapat langsung dikelola dan Anda dapat mulai membuat halaman custom bila memang diperlukan. Tentu saja penggunaan halaman admin Django ini bukan opsi yang utama karena ada beberapa fitur dan widget yang terbatas.Namun pilihan ini hadir karena background Django sendiri yang lahir di dunia jurnalistik di sebuah media di Amerika Serikat. Ketika tim development harus mengejar deadline dalam membantu tim jurnalis memasukkan berita, maka halaman admin Django menjadi pilihan pertama sebelum akhirnya membuat halaman admin yang lebih sesuai dengan kebutuhan.

Halaman admin Django juga belum tersedia untuk database non-relasional seperti MongoDB, Cassandra, Neo4j, ELasticsearch dan lainnya. Namun beberapa object mapper untuk database non-relasional sudah dapat diintegrasikan dengan Django. Selamat mencoba tutorial ini dan selamat ngabuburit bila Anda sedang menjalankan ibadah puasa.

(rfs/djangoproject)