SIPUSTAKA adalah aplikasi web berbasis Django untuk pengelolaan perpustakaan sekolah. Aplikasi ini mendukung pengelolaan data buku, data user/siswa, transaksi peminjaman, pengembalian buku, serta dashboard ringkasan untuk kebutuhan administrasi.
Nama yang digunakan pada project ini:
SIPUSTAKA (Sistem Peminjaman Buku Perpustakaan)
Project ini disusun sebagai bahan pembelajaran dan acuan implementasi aplikasi Django sederhana untuk siswa. Karena itu, struktur dan alurnya dibuat cukup mudah dipahami, tetapi tetap mendekati pola kerja project nyata.
- Python
- Django 6
- SQLite
- PostgreSQL
- Template Engine Django
- Tailwind CSS via CDN
Halaman dashboard menampilkan ringkasan data perpustakaan, meliputi:
- total stok buku
- total judul buku
- total transaksi yang sedang dipinjam
- total transaksi yang sudah dikembalikan
- total transaksi terlambat
- total seluruh transaksi
- total user/siswa
- jumlah user aktif dan tidak aktif
- distribusi stok buku per kategori
- daftar peminjaman terbaru
Modul buku mendukung:
- daftar buku
- tambah buku
- detail buku
- edit buku
- hapus buku
Field utama buku:
judulpengarangkategoripenerbittahun_terbitstokisbnrakdeskripsi
Modul siswa pada implementasi ini dipakai sebagai data user/peminjam. Fitur yang tersedia:
- daftar user
- tambah user
- detail user
- edit user
- hapus user
Field utama user:
namakelasnisis_active
Modul peminjaman mendukung:
- daftar transaksi peminjaman
- tambah transaksi peminjaman
- halaman konfirmasi pengembalian
- proses pengembalian buku
Field utama transaksi:
siswa_idbuku_idtanggal_pinjamjatuh_tempokeperluanstatuscreated_at
- hanya user aktif yang dapat melakukan peminjaman
- hanya buku dengan stok tersedia yang dapat dipinjam
jatuh_tempotidak boleh lebih awal daritanggal_pinjam- stok buku otomatis berkurang saat peminjaman dibuat
- stok buku otomatis bertambah saat pengembalian dilakukan
- user dengan riwayat peminjaman tidak dapat dihapus
- proses peminjaman dan pengembalian memakai transaksi database (
transaction.atomic())
sipustaka/
├── buku/
│ ├── migrations/
│ ├── templates/
│ │ └── buku/
│ ├── models.py
│ ├── urls.py
│ └── views.py
├── peminjaman/
│ ├── management/
│ │ ├── commands/
│ │ └── seed_data.py
│ ├── migrations/
│ ├── templates/
│ │ └── peminjaman/
│ ├── models.py
│ ├── urls.py
│ └── views.py
├── siswa/
│ ├── migrations/
│ ├── templates/
│ │ └── siswa/
│ ├── models.py
│ ├── urls.py
│ └── views.py
├── templates/
│ ├── includes/
│ └── dashboard.html
├── sipustaka/
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ ├── views.py
│ └── wsgi.py
├── .env.example
├── manage.py
├── README.md
└── requirements.txt
Secara struktur, project ini sudah memakai pola dasar Django:
- setiap domain utama dipisah ke app tersendiri
- template per app sudah memakai namespace folder
- URL per app sudah memakai namespace Django
- migration awal sudah tersedia
- data seed sudah disiapkan lewat management command
Namun demikian, ada satu catatan penting:
- sebagian besar logika query pada
views.pymasih memakai raw SQL melaluidjango.db.connection
Pendekatan ini masih valid untuk pembelajaran, tetapi bukan pola paling ideal untuk project Django yang lebih besar. Pada tahap lanjutan, query tersebut sebaiknya dipindahkan bertahap ke ORM Django.
Sebelum menjalankan aplikasi, siapkan:
- Python 3.12 atau yang kompatibel dengan Django 6
- PostgreSQL
pip- virtual environment Python
Isi requirements.txt:
Django==6.0.5
psycopg2-binary==2.9.10Project ini membaca konfigurasi dari file .env di root project.
Variabel yang digunakan:
DJANGO_SECRET_KEYDJANGO_DEBUGDJANGO_ALLOWED_HOSTSDJANGO_CSRF_TRUSTED_ORIGINSDJANGO_LANGUAGE_CODEDJANGO_TIME_ZONEDATABASE_URLDB_ENGINEDB_NAMEDB_USERDB_PASSWORDDB_HOSTDB_PORTSTATIC_URLSTATIC_ROOTMEDIA_URLMEDIA_ROOT
Aturan pembacaan database:
- jika
DATABASE_URLdiisi, nilainya dipakai terlebih dahulu - jika
DATABASE_URLkosong, aplikasi memakai kombinasiDB_ENGINE,DB_NAME,DB_USER,DB_PASSWORD,DB_HOST, danDB_PORT - pada konfigurasi sementara saat ini,
SQLitedijadikan default untuk memudahkan deployment sederhana
Contoh format DATABASE_URL:
postgresql://username:password@hostname:5432/nama_database
git clone <url-repository>
cd sipustakapython -m venv .venv
source .venv/bin/activateUntuk Windows:
.venv\Scripts\activatepip install -r requirements.txtcp .env.example .envContoh .env lokal aktif saat ini:
DJANGO_SECRET_KEY=change-this-for-local-development
DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=127.0.0.1,localhost
DJANGO_CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,http://localhost:8000
DJANGO_LANGUAGE_CODE=id-id
DJANGO_TIME_ZONE=Asia/Jakarta
DB_ENGINE=django.db.backends.sqlite3
DB_NAME=db.sqlite3
STATIC_URL=/static/
STATIC_ROOT=/Users/username/path/to/sipustaka/staticfiles
MEDIA_URL=/media/
MEDIA_ROOT=/Users/username/path/to/sipustaka/mediaJika ingin kembali ke PostgreSQL, uncomment konfigurasi berikut:
# Opsi 1: connection string penuh
# DATABASE_URL=postgresql://postgres:[email protected]:5432/sipustaka_db
# Opsi 2: konfigurasi per field
# DB_ENGINE=django.db.backends.postgresql
# DB_NAME=sipustaka_db
# DB_USER=postgres
# DB_PASSWORD=postgres
# DB_HOST=127.0.0.1
# DB_PORT=5432Jika memakai SQLite, Anda tidak perlu membuat database manual. File db.sqlite3 akan dibuat otomatis saat migration dijalankan.
Contoh:
CREATE DATABASE sipustaka_db;python manage.py migratepython manage.py seed_sipustakapython manage.py runserverLalu buka:
http://127.0.0.1:8000/
python manage.py seed_sipustakaSeeder akan menambahkan:
- data user contoh
- data buku contoh
- data transaksi peminjaman contoh
Seeder akan berhenti jika tabel peminjaman sudah berisi data.
python manage.py reset_seed_sipustakaCommand ini akan:
- menghapus data
peminjaman - menghapus data
buku - menghapus data
siswa - menjalankan seed ulang
Gunakan command ini hanya untuk development, demo, atau pembelajaran.
Jika Anda ingin membuat tabel secara manual tanpa migration, berikut schema minimum yang sesuai dengan implementasi project.
CREATE TABLE buku (
id SERIAL PRIMARY KEY,
judul VARCHAR(255) NOT NULL,
pengarang VARCHAR(255) NOT NULL,
kategori VARCHAR(100) NOT NULL,
penerbit VARCHAR(255) NOT NULL,
tahun_terbit INTEGER NOT NULL,
stok INTEGER NOT NULL DEFAULT 0,
isbn VARCHAR(50) NOT NULL,
rak VARCHAR(100) NOT NULL,
deskripsi TEXT
);CREATE TABLE siswa (
id SERIAL PRIMARY KEY,
nama VARCHAR(255) NOT NULL,
kelas VARCHAR(100) NOT NULL,
nis VARCHAR(50) NOT NULL,
is_active BOOLEAN NOT NULL DEFAULT TRUE
);CREATE TABLE peminjaman (
id SERIAL PRIMARY KEY,
siswa_id INTEGER REFERENCES siswa(id),
buku_id INTEGER REFERENCES buku(id),
tanggal_pinjam DATE NOT NULL,
jatuh_tempo DATE NOT NULL,
keperluan VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);- buka halaman utama
/ - lihat ringkasan stok, transaksi, dan user
- buka menu
Buku - gunakan tombol
Tambah Bukuuntuk menambah data - gunakan tombol
Detail,Edit, danHapuspada tabel daftar buku
- buka menu
User - gunakan tombol
Tambah Useruntuk menambah data - gunakan tombol
Detail,Edit, danHapuspada tabel daftar user
- buka menu
Peminjaman - klik
Pinjam Bukuuntuk membuat transaksi baru - klik
Kembalikanuntuk membuka halaman konfirmasi pengembalian
Skenario deployment sederhana yang dipakai sementara pada project ini:
- PythonAnywhere digunakan untuk hosting aplikasi Django
- database memakai SQLite agar setup lebih ringan
- konfigurasi PostgreSQL tetap disimpan dalam bentuk komentar agar mudah diaktifkan kembali nanti
Pendekatan ini paling cocok untuk:
- demo sederhana
- pembelajaran siswa
- deployment awal tanpa ketergantungan database eksternal
Berdasarkan dokumentasi resmi PythonAnywhere yang saya cek pada 8 Juni 2026:
- PostgreSQL bawaan PythonAnywhere tersedia pada plan berbayar sebagai add-on
- koneksi dari aplikasi PythonAnywhere ke database eksternal memerlukan akun berbayar
- akun gratis baru memiliki pembatasan outbound internet
Karena itu, untuk deployment sederhana dan cepat, SQLite adalah pilihan yang paling aman.
DJANGO_SECRET_KEY=ganti-dengan-secret-key-production-yang-aman
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=yourusername.pythonanywhere.com
DJANGO_CSRF_TRUSTED_ORIGINS=https://yourusername.pythonanywhere.com
DJANGO_LANGUAGE_CODE=id-id
DJANGO_TIME_ZONE=Asia/Jakarta
DB_ENGINE=django.db.backends.sqlite3
DB_NAME=db.sqlite3
STATIC_URL=/static/
STATIC_ROOT=/home/yourusername/sipustaka/staticfiles
MEDIA_URL=/media/
MEDIA_ROOT=/home/yourusername/sipustaka/mediaJika nanti ingin kembali memakai PostgreSQL, uncomment konfigurasi PostgreSQL yang sudah disiapkan di .env atau .env.example.
git clone <url-repository> ~/sipustaka
cd ~/sipustakamkvirtualenv --python=/usr/bin/python3.13 sipustaka-venv
workon sipustaka-venv
pip install -r requirements.txtPastikan versi Python virtualenv sama dengan versi Python saat membuat web app.
cp .env.example .envUntuk mode sederhana, cukup gunakan konfigurasi SQLite yang sudah aktif. Jika nanti ingin memakai PostgreSQL, uncomment bagian PostgreSQL di .env lalu isi sesuai connection string yang diberikan.
Di tab Web:
- klik
Add a new web app - pilih
Manual configuration - pilih versi Python yang sama dengan virtualenv
- isi
Virtualenvdengansipustaka-venv - isi
Source codedanWorking directorydengan/home/yourusername/sipustaka
PythonAnywhere tidak memakai file sipustaka/wsgi.py milik project secara langsung. Yang harus diedit adalah file WSGI milik web app PythonAnywhere di tab Web.
Contoh isi minimal:
import os
import sys
path = '/home/yourusername/sipustaka'
if path not in sys.path:
sys.path.insert(0, path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'sipustaka.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()Karena project ini sudah membaca .env langsung dari root project melalui settings.py, Anda tidak perlu menambahkan loader .env lagi di file WSGI.
cd ~/sipustaka
workon sipustaka-venv
python manage.py migratepython manage.py seed_sipustakapython manage.py collectstatic --noinputDi tab Web -> Static files, tambahkan:
- URL:
/static/ - Directory:
/home/yourusername/sipustaka/staticfiles
Jika nanti menggunakan media upload, tambahkan juga:
- URL:
/media/ - Directory:
/home/yourusername/sipustaka/media
Kembali ke tab Web, lalu klik Reload.
Pastikan hal-hal berikut sudah benar:
DEBUG=FalseALLOWED_HOSTSberisi domain PythonAnywhereCSRF_TRUSTED_ORIGINSberisi URLhttps://...pythonanywhere.com- database sudah sesuai dengan mode yang dipilih
collectstaticsudah dijalankan- static mapping sudah benar
- migration berhasil dijalankan
Jika aplikasi gagal tampil:
- cek
Error logdi tabWeb - cek path project dan virtualenv
- cek isi
.env - cek
ALLOWED_HOSTSdanCSRF_TRUSTED_ORIGINS - jalankan
python manage.py check - jika memakai PostgreSQL, pastikan host database dapat diakses dari PythonAnywhere
Hal yang sudah tersedia:
- struktur app sudah dipisah dengan cukup rapi
- template sudah memakai namespace per app
- migration awal sudah tersedia
- seeder data awal sudah tersedia
- konfigurasi environment sudah memakai
.env - project sudah mendukung
DATABASE_URL - SQLite sekarang dijadikan mode aktif default untuk deployment sederhana
Hal yang masih perlu dikembangkan:
- query raw SQL masih dominan di layer view
- belum ada autentikasi dan otorisasi pengguna
- belum ada pagination dan pencarian data
- belum ada pengelolaan denda keterlambatan
- test otomatis masih sangat minim
Jika project ini ingin dikembangkan lebih lanjut, urutan prioritas yang disarankan:
- pindahkan query raw SQL ke ORM Django secara bertahap
- tambahkan
forms.pyuntuk validasi form yang lebih idiomatik - tambahkan autentikasi login admin/petugas
- tambahkan pagination, pencarian, dan filter data
- tambahkan pengelolaan denda dan status keterlambatan otomatis
- tambahkan unit test dan integration test
- rapikan pemisahan service logic dari view
Berfungsi sebagai project Django utama:
settings.pyuntuk konfigurasiurls.pyuntuk routing globalviews.pyuntuk dashboard
Berfungsi untuk pengelolaan koleksi buku:
- daftar buku
- detail buku
- tambah buku
- edit buku
- hapus buku
Berfungsi untuk pengelolaan data user/peminjam:
- daftar user
- detail user
- tambah user
- edit user
- hapus user
Berfungsi untuk pengelolaan transaksi sirkulasi buku:
- daftar peminjaman
- tambah peminjaman
- konfirmasi pengembalian
- proses pengembalian
Status saat ini:
- layak digunakan sebagai bahan pembelajaran
- fitur dasar perpustakaan sudah berjalan
- sudah siap dijadikan acuan deployment sederhana
- belum ditujukan sebagai sistem production-ready
Belum ada lisensi yang didefinisikan pada repository ini. Jika project akan dipublikasikan lebih luas, sebaiknya tambahkan file LICENSE.
- PythonAnywhere deploy Django: https://help.pythonanywhere.com/pages/DeployExistingDjangoProject/
- PythonAnywhere static files Django: https://help.pythonanywhere.com/pages/DjangoStaticFiles
- PythonAnywhere environment variables: https://help.pythonanywhere.com/pages/environment-variables-for-web-apps/
- PythonAnywhere jenis database: https://help.pythonanywhere.com/pages/KindsOfDatabases/
- PythonAnywhere PostgreSQL: https://help.pythonanywhere.com/pages/PostgresGettingStarted