Aplikasi web mobile-first berbasis Django untuk pemantauan kesehatan mental ibu hamil di Puskesmas Lansot, Kota Tomohon.
- Tentang Aplikasi
- Fitur Lengkap
- Arsitektur & Tech Stack
- Struktur Proyek
- Persyaratan Sistem
- Instalasi & Setup (SQLite — Development)
- Instalasi & Setup (MySQL — Production dengan Laragon)
- Seed Data Demo
- Akun Default & Cara Login
- Panduan URL & Navigasi
- Peran Pengguna (Role-Based Access)
- Model Database
- Konfigurasi Settings
- Menjalankan Server
- Admin Django
- Migrasi Database
- Troubleshooting
- Deployment ke Production
PRENAMENT adalah platform digital kesehatan mental ibu hamil yang dibangun khusus untuk Puskesmas Lansot, Kota Tomohon. Aplikasi ini menghubungkan tiga pemangku kepentingan:
| Peran | Deskripsi |
|---|---|
| Ibu Hamil | Melakukan skrining mandiri, membaca edukasi, latihan relaksasi, dan mempersiapkan persalinan |
| Kader Posyandu | Memantau ibu hamil di wilayahnya, mengelola jadwal kegiatan, dan membuat laporan |
| Petugas Puskesmas | Mengelola seluruh pengguna, artikel edukasi, dan statistik wilayah |
Skrining yang digunakan: PRAQ-R2 (Pregnancy-Related Anxiety Questionnaire — Revised 2) — kuesioner tervalidasi untuk mengukur kecemasan ibu hamil.
Bahasa antarmuka: Bahasa Indonesia Format tampilan: Mobile-first (lebar 390px, orientasi portrait, seperti Android)
| Halaman | Fitur |
|---|---|
| Beranda | Sambutan, skor skrining terakhir, kategori risiko, jadwal dari kader |
| Skrining | Kuesioner PRAQ-R2 (4 pertanyaan, skala 0-4), riwayat 3 skrining terakhir |
| Hasil Skrining | Skor total, kategori risiko (Rendah/Sedang/Tinggi), riwayat historis |
| Edukasi | Artikel kesehatan mental dengan filter 6 kategori, konten baca penuh |
| Relaksasi | 4 latihan audio (pernapasan, relaksasi otot, body scan, visualisasi), 6 afirmasi harian |
| Siaga Bencana | 5-item checklist kesiapan persalinan, dapat dicentang/uncentang |
| Profil | Edit nama, usia, alamat, usia kehamilan, status paritas |
| Halaman | Fitur |
|---|---|
| Beranda | Total ibu binaan, jumlah risiko tinggi, daftar perhatian khusus, jadwal terdekat |
| Daftar Ibu | Semua ibu hamil dalam wilayah kader, dengan usia kehamilan |
| Monitor | Daftar skor terurut, analisis tren (naik/turun/stabil), persentase dari skor max |
| Detail Ibu | Profil lengkap, riwayat 5 skrining terakhir, skor terakhir dan kategori risiko |
| Jadwal | CRUD jadwal kegiatan (tambah/hapus), dengan tanggal, waktu, dan venue |
| Laporan | Pie chart distribusi risiko (SVG), total skrining, rata-rata skor |
| Profil | Edit nama, nama posyandu, wilayah |
| Halaman | Fitur |
|---|---|
| Beranda | Dashboard: total ibu, total kader, ibu risiko tinggi, total skrining, rata-rata skor |
| Manajemen Pengguna | Tab Ibu/Kader, pencarian nama, tampilkan kategori risiko |
| Statistik | Bar chart tren skrining 6 bulan (SVG), breakdown per wilayah/kader |
| Artikel | CRUD artikel edukasi: buat, edit, hapus, toggle publikasi |
| Profil | Edit nama, NIP, nama puskesmas, jabatan |
Backend: Django 4.2, Python 3.11
Database: SQLite (development) / MySQL 8.4 (production via Laragon)
Frontend: Django Templates, CSS custom (mobile-first, tanpa framework CSS eksternal)
Auth: Custom User Model berbasis AbstractUser dengan field role
Session: Cookie-based, 24 jam
PWA: Web App Manifest + Service Worker (sw.js)
django_app/
├── manage.py # Entry point Django CLI
├── requirements.txt # Dependensi Python
├── setup.py # Script setup alternatif (legacy)
├── db.sqlite3 # Database SQLite (auto-generated)
│
├── prenament/ # Konfigurasi proyek Django
│ ├── settings.py # Semua konfigurasi
│ ├── urls.py # URL utama (root routing)
│ ├── wsgi.py # Entry point WSGI (production)
│ └── asgi.py # Entry point ASGI (async)
│
├── accounts/ # App: autentikasi & manajemen user
│ ├── models.py # CustomUser (AbstractUser + role)
│ ├── views.py # login_view, logout_view, role_required
│ ├── admin.py # Registrasi admin
│ ├── migrations/ # Migrasi database
│ └── management/
│ └── commands/
│ └── seed.py # Command: python manage.py seed
│
├── ibu/ # App: fitur ibu hamil
│ ├── models.py # IbuProfil, SkriningHasil, SiagaChecklist, ArtikelEdukasi
│ ├── views.py # 7 view: beranda, skrining, hasil, edukasi, relaksasi, siaga, profil
│ ├── urls.py # URL namespace 'ibu'
│ ├── admin.py
│ └── migrations/
│
├── kader/ # App: fitur kader posyandu
│ ├── models.py # KaderProfil, Jadwal
│ ├── views.py # 7 view: beranda, daftar_ibu, monitor, detail_ibu, jadwal, laporan, profil
│ ├── urls.py # URL namespace 'kader'
│ ├── admin.py
│ └── migrations/
│
├── petugas/ # App: fitur petugas puskesmas
│ ├── models.py # PetugasProfil
│ ├── views.py # 6 view: beranda, pengguna, statistik, profil, artikel CRUD
│ ├── urls.py # URL namespace 'petugas'
│ ├── admin.py
│ └── migrations/
│
├── templates/ # Semua template HTML
│ ├── base.html # Layout dasar (header + konten + bottom nav)
│ ├── login.html # Halaman login
│ ├── ibu/ # 7 template ibu
│ │ ├── beranda.html
│ │ ├── skrining.html
│ │ ├── hasil_skrining.html
│ │ ├── edukasi.html
│ │ ├── relaksasi.html
│ │ ├── siaga.html
│ │ └── profil.html
│ ├── kader/ # 7 template kader
│ │ ├── beranda.html
│ │ ├── daftar_ibu.html
│ │ ├── detail_ibu.html
│ │ ├── jadwal.html
│ │ ├── laporan.html
│ │ ├── monitor.html
│ │ └── profil.html
│ └── petugas/ # 5 template petugas
│ ├── beranda.html
│ ├── pengguna.html
│ ├── statistik.html
│ ├── profil.html
│ ├── artikel_list.html
│ └── artikel_form.html
│
└── static/ # Asset statis
├── css/
│ └── prenament.css # Design system: warna, komponen, layout mobile
├── js/
│ ├── prenament.js # Interaksi UI: modal, chart, toggle
│ └── sw.js # Service Worker (PWA offline support)
└── manifest.json # PWA Web App Manifest
| Komponen | Versi Minimum |
|---|---|
| Python | 3.10+ (diuji pada 3.11.9) |
| Django | 4.2+ |
| pip | 22+ |
| Browser | Chrome 90+, Firefox 88+, Edge 90+ |
| Komponen | Versi |
|---|---|
| Laragon | 6.0+ |
| MySQL | 8.0+ (atau 8.4 bawaan Laragon) |
| mysqlclient | 2.2+ |
Cara tercepat untuk menjalankan aplikasi lokal tanpa MySQL.
cd C:\laragon\www\PRENAMENT\django_apppip install django==4.2 python-decoupleTidak perlu
mysqlclientuntuk mode SQLite.
Buka prenament/settings.py, pastikan bagian DATABASES seperti ini:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}Jika ada konfigurasi MySQL, comment atau hapus terlebih dahulu.
python manage.py migrateOutput yang diharapkan:
Operations to perform:
Apply all migrations: accounts, admin, auth, contenttypes, ibu, kader, petugas, sessions
Running migrations:
Applying accounts.0001_initial... OK
Applying ibu.0001_initial... OK
Applying kader.0001_initial... OK
Applying petugas.0001_initial... OK
...
python manage.py seedOutput:
Membuat petugas... OK dr. Sari Putri
Membuat artikel edukasi... OK 16 artikel dibuat
Membuat kader... OK Bidan Anisa Rahmat
Membuat ibu hamil... OK 30 ibu hamil dibuat
OK Seed selesai!
Petugas: 3 akun
Kader: 5 akun
Ibu hamil:30 akun
Artikel: 16 artikel
Jadwal: 20 jadwal
python manage.py runserverBuka browser: http://127.0.0.1:8000
pip install -r requirements.txtIsi requirements.txt:
Django==4.2.7
mysqlclient==2.2.0
python-decouple==3.8
- Buka Laragon (tray icon atau shortcut desktop)
- Klik Start All — pastikan MySQL status Running (hijau)
- Verifikasi MySQL: buka HeidiSQL atau cek port 3306 aktif
Buka HeidiSQL (dari Laragon) atau terminal MySQL:
CREATE DATABASE prenament CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Atau via Laragon terminal:
C:\laragon\bin\mysql\mysql-8.4.3-winx64\bin\mysql.exe -u root -e "CREATE DATABASE prenament CHARACTER SET utf8mb4;"Buka prenament/settings.py dan ganti blok DATABASES:
# Nonaktifkan SQLite:
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }
# Aktifkan MySQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'prenament',
'USER': 'root',
'PASSWORD': '', # Password MySQL Laragon (default: kosong)
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}python manage.py migrate
python manage.py seedpython manage.py runserverCommand python manage.py seed membuat data demo lengkap:
| Data | Jumlah | Keterangan |
|---|---|---|
| Petugas Puskesmas | 3 akun | sari, budi, nani |
| Kader Posyandu | 5 akun | anisa, kader2, kader3, kader4, kader5 |
| Ibu Hamil | 30 akun | Distribusi risiko tinggi/sedang/rendah |
| Artikel Edukasi | 16 artikel | 6 kategori, semua dipublikasikan |
| Jadwal Kegiatan | 20 jadwal | Tersebar di 5 kader |
| Hasil Skrining | 150+ entri | Riwayat historis per ibu |
| Siaga Checklist | 60+ entri | Status checklist per ibu |
Peringatan: Seed akan menghapus semua data lama sebelum membuat ulang. Jangan jalankan di production dengan data nyata.
Semua akun menggunakan password: pass123
| Username | Nama Lengkap | Kategori Risiko | Usia Kehamilan |
|---|---|---|---|
citra |
Citra Dewi | Risiko Tinggi (skor ~37) | 32 minggu |
rina |
Rina Wulandari | Risiko Sedang (skor ~22) | 24 minggu |
lestari |
Lestari Indah | Risiko Rendah (skor ~12) | 16 minggu |
putri |
Putri Amelia | Risiko Rendah (skor ~14) | 28 minggu |
| Username | Nama | Posyandu | Wilayah |
|---|---|---|---|
anisa |
Bidan Anisa Rahmat | Posyandu Melati 1 | Kelurahan Bahagia |
kader2 |
Bidan Maya Sari | Posyandu Melati 2 | Kelurahan Sejahtera |
kader3 |
Bidan Tati Kurniawan | Posyandu Mawar 1 | Kelurahan Merdeka |
kader4 |
Bidan Yuli Pratiwi | Posyandu Mawar 2 | Kelurahan Damai |
kader5 |
Bidan Rina Susanto | Posyandu Anggrek | Kelurahan Harapan |
| Username | Nama | Jabatan |
|---|---|---|
sari |
dr. Sari Putri | Kepala Puskesmas |
budi |
dr. Budi Santoso | Dokter Umum |
nani |
Nani Suryani, S.Kep | Perawat |
- Buka http://127.0.0.1:8000
- Masukkan username dan password
- Sistem otomatis mengarahkan ke dashboard sesuai role
| URL | Halaman |
|---|---|
/ |
Halaman Login |
/admin/ |
Django Admin Panel |
/logout/ |
Logout & redirect ke login |
| URL | Nama Route | Keterangan |
|---|---|---|
/ibu/beranda/ |
ibu:beranda |
Dashboard ibu |
/ibu/skrining/ |
ibu:skrining |
Form kuesioner PRAQ-R2 |
/ibu/skrining/hasil/ |
ibu:hasil_skrining |
Hasil & riwayat skrining |
/ibu/edukasi/ |
ibu:edukasi |
Semua artikel edukasi |
/ibu/edukasi/?kat=kecemasan |
— | Filter per kategori |
/ibu/relaksasi/ |
ibu:relaksasi |
Latihan relaksasi & afirmasi |
/ibu/siaga/ |
ibu:siaga |
Checklist siaga bencana |
/ibu/profil/ |
ibu:profil |
Edit profil ibu |
Kategori edukasi yang tersedia:
kecemasan · depresi · nutrisi · persalinan · bayi · umum
| URL | Nama Route | Keterangan |
|---|---|---|
/kader/beranda/ |
kader:beranda |
Dashboard kader |
/kader/daftar-ibu/ |
kader:daftar_ibu |
Daftar semua ibu binaan |
/kader/monitor/ |
kader:monitor |
Monitoring skor & risiko |
/kader/detail/<id>/ |
kader:detail_ibu |
Detail satu ibu hamil |
/kader/jadwal/ |
kader:jadwal |
Kelola jadwal kegiatan |
/kader/laporan/ |
kader:laporan |
Laporan statistik |
/kader/profil/ |
kader:profil |
Edit profil kader |
| URL | Nama Route | Keterangan |
|---|---|---|
/petugas/beranda/ |
petugas:beranda |
Dashboard puskesmas |
/petugas/pengguna/ |
petugas:pengguna |
Manajemen pengguna (default: tab ibu) |
/petugas/pengguna/?tab=ibu&q=nama |
— | Cari ibu hamil |
/petugas/pengguna/?tab=kader |
— | Tab daftar kader |
/petugas/statistik/ |
petugas:statistik |
Statistik & grafik |
/petugas/profil/ |
petugas:profil |
Edit profil petugas |
/petugas/artikel/ |
petugas:artikel_list |
Daftar artikel edukasi |
/petugas/artikel/buat/ |
petugas:artikel_create |
Buat artikel baru |
/petugas/artikel/<id>/edit/ |
petugas:artikel_edit |
Edit artikel |
/petugas/artikel/<id>/hapus/ |
petugas:artikel_delete |
Hapus artikel (POST only) |
Setiap view dilindungi decorator @role_required('role'). Pengguna yang mengakses halaman role lain akan di-redirect ke login.
+------------------------------------------------------------------+
| CustomUser.role |
+------------------+--------------------+-------------------------+
| 'ibu' | 'kader' | 'petugas' |
+------------------+--------------------+-------------------------+
| /ibu/* (7 hal) | /kader/* (7 hal) | /petugas/* (6 hal) |
| | | |
| Hanya data | Hanya ibu binaan | Lihat semua pengguna |
| milik sendiri | di kadernya | di sistem |
+------------------+--------------------+-------------------------+
Aturan keamanan data:
- Ibu hanya bisa melihat dan mengedit data miliknya sendiri
- Kader hanya bisa mengakses detail ibu yang terdaftar di wilayahnya (
/kader/detail/<pk>/mengembalikan 404 jika ibu bukan binaan kader tersebut) - Petugas dapat melihat semua ibu, kader, dan statistik sistem
Extends AbstractUser Django dengan tambahan field:
| Field | Tipe | Keterangan |
|---|---|---|
username |
CharField | Username unik login |
email |
EmailField | Email pengguna |
password |
CharField | Hash password (bcrypt) |
role |
CharField | ibu / kader / petugas |
nama_lengkap |
CharField | Nama tampilan di aplikasi |
| Field | Tipe | Keterangan |
|---|---|---|
user |
OneToOneField | Akun CustomUser terkait |
usia |
IntegerField | Usia ibu (tahun) |
alamat |
TextField | Alamat lengkap |
usia_kehamilan |
IntegerField | Usia kehamilan saat ini (minggu) |
paritas |
IntegerField | Jumlah kehamilan sebelumnya (0 = pertama kali) |
kader |
ForeignKey | Kader yang membina ibu ini |
created_at |
DateTimeField | Waktu dibuat |
updated_at |
DateTimeField | Waktu diperbarui |
Method penting:
get_skor_terakhir()→ skor skrining terbaru (0 jika belum pernah skrining)get_kategori_risiko()→'Risiko Tinggi'/'Risiko Sedang'/'Risiko Rendah'
| Field | Tipe | Keterangan |
|---|---|---|
ibu |
ForeignKey | Profil ibu pemilik skrining |
skor |
IntegerField | Total skor PRAQ-R2 (0-16) |
kategori_risiko |
CharField | rendah / sedang / tinggi |
jawaban |
JSONField | Jawaban per pertanyaan: {"q0": 3, "q1": 4, ...} |
created_at |
DateTimeField | Waktu skrining dilakukan |
Kategori risiko berdasarkan skor:
| Rentang Skor | Kategori |
|---|---|
| >= 30 | Risiko Tinggi |
| 18 - 29 | Risiko Sedang |
| < 18 | Risiko Rendah |
4 Pertanyaan PRAQ-R2 (skala 0-4):
- Saya cemas tentang persalinan
- Saya khawatir tentang rasa sakit kontraksi dan persalinan
- Saya takut bayi saya tidak sehat
- Saya khawatir tentang perubahan tubuh saya
| Field | Tipe | Keterangan |
|---|---|---|
ibu |
ForeignKey | Profil ibu pemilik checklist |
nomor_item |
IntegerField | Nomor item 1-5 (unique per ibu) |
sudah_dicentang |
BooleanField | Status centang |
5 Item Checklist Siaga Bencana:
- Tas siaga berisi obat-obatan pribadi, makanan ringan, air minum, dan dokumen penting
- Nomor telepon darurat tersimpan di HP
- Jalur evakuasi dari rumah ke titik kumpul telah diketahui
- Power bank terisi penuh
- Pakaian ganti yang nyaman untuk 2-3 hari
| Field | Tipe | Keterangan |
|---|---|---|
judul |
CharField | Judul artikel |
ringkasan |
TextField | Ringkasan singkat (preview) |
konten |
TextField | Isi artikel lengkap |
kategori |
CharField | kecemasan / depresi / nutrisi / persalinan / bayi / umum |
penulis |
ForeignKey | Petugas pembuat artikel |
diterbitkan |
BooleanField | Status publikasi (True = tampil ke ibu) |
created_at |
DateTimeField | Waktu dibuat |
updated_at |
DateTimeField | Waktu diperbarui |
| Field | Tipe | Keterangan |
|---|---|---|
user |
OneToOneField | Akun CustomUser terkait |
posyandu |
CharField | Nama posyandu |
wilayah |
CharField | Nama kelurahan/wilayah binaan |
created_at |
DateTimeField | Waktu dibuat |
updated_at |
DateTimeField | Waktu diperbarui |
Method penting:
get_jumlah_ibu()→ total ibu hamil binaan kader iniget_ibu_risiko_tinggi()→ jumlah ibu binaan dengan risiko tinggi
| Field | Tipe | Keterangan |
|---|---|---|
kader |
ForeignKey | Kader pemilik jadwal |
judul |
CharField | Nama kegiatan |
venue |
CharField | Lokasi kegiatan |
tanggal |
DateField | Tanggal kegiatan (YYYY-MM-DD) |
waktu |
TimeField | Waktu mulai (HH:MM) |
deskripsi |
TextField | Keterangan tambahan |
created_at |
DateTimeField | Waktu dibuat |
| Field | Tipe | Keterangan |
|---|---|---|
user |
OneToOneField | Akun CustomUser terkait |
nip |
CharField | Nomor Induk Pegawai (unik) |
puskesmas |
CharField | Nama puskesmas tempat bertugas |
jabatan |
CharField | Jabatan/posisi di puskesmas |
created_at |
DateTimeField | Waktu dibuat |
updated_at |
DateTimeField | Waktu diperbarui |
CustomUser (1)
├── IbuProfil (1:1)
│ ├── SkriningHasil (1:N) <- riwayat skrining PRAQ-R2
│ ├── SiagaChecklist (1:N) <- status 5 item checklist
│ └── kader (N:1) ──────────────────────────┐
│ │
├── KaderProfil (1:1) <───────────────┘
│ └── Jadwal (1:N) <- jadwal kegiatan posyandu
│
└── PetugasProfil (1:1)
ArtikelEdukasi
└── penulis (N:1) --> CustomUser (harus role 'petugas')
File: prenament/settings.py
| Setting | Nilai Default | Keterangan |
|---|---|---|
DEBUG |
True |
Set False di production |
SECRET_KEY |
django-insecure-... |
Wajib diganti di production |
ALLOWED_HOSTS |
['localhost', '127.0.0.1', '*'] |
Batasi ke domain spesifik di production |
LANGUAGE_CODE |
'id-id' |
Bahasa Indonesia |
TIME_ZONE |
'Asia/Jakarta' |
WIB (UTC+7) |
SESSION_COOKIE_AGE |
86400 |
Durasi sesi = 24 jam |
SESSION_COOKIE_SECURE |
False |
Set True jika pakai HTTPS |
AUTH_USER_MODEL |
'accounts.CustomUser' |
Custom user model |
LOGIN_URL |
'login' |
Redirect URL jika belum login |
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"Salin hasilnya ke settings.py:
SECRET_KEY = 'hasil-key-acak-anda-di-sini-yang-sangat-panjang'cd C:\laragon\www\PRENAMENT\django_app
python manage.py runserverAkses: http://127.0.0.1:8000
python manage.py runserver 8080python manage.py runserver 0.0.0.0:8000Temukan IP komputer:
ipconfig
# Contoh: 192.168.1.5Buka di HP: http://192.168.1.5:8000
# Windows PowerShell
Start-Process -NoNewWindow python -ArgumentList "manage.py runserver"
# Git Bash / WSL
python manage.py runserver &python manage.py createsuperuserContoh:
Username: admin
Email address: admin@puskesmaslansot.id
Password: (ketik password)
Password (again): (konfirmasi)
Superuser created successfully.
URL: http://127.0.0.1:8000/admin/
| Model | App | Keterangan |
|---|---|---|
| Users (CustomUser) | accounts | Semua akun sistem |
| Profil Ibu Hamil | ibu | Data profil ibu |
| Hasil Skrining | ibu | Riwayat skrining PRAQ-R2 |
| Siaga Checklist | ibu | Status checklist per ibu |
| Artikel Edukasi | ibu | Artikel yang ditampilkan ke ibu |
| Profil Kader Posyandu | kader | Data profil kader |
| Jadwal Kader | kader | Jadwal kegiatan posyandu |
| Profil Petugas Puskesmas | petugas | Data profil petugas |
python manage.py makemigrations
python manage.py migratepython manage.py showmigrations# Windows
del db.sqlite3
# Linux/Mac
rm db.sqlite3
# Migrasi ulang + seed data
python manage.py migrate
python manage.py seed-- Jalankan di HeidiSQL atau MySQL client
DROP DATABASE prenament;
CREATE DATABASE prenament CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;python manage.py migrate
python manage.py seedcontenttypes.0001_initial
auth.0001_initial ... auth.0012_...
accounts.0001_initial
-> kader.0001_initial
-> ibu.0001_initial
-> ibu.0002_add_artikel_edukasi
-> petugas.0001_initial
sessions.0001_initial
Penyebab: MySQL tidak berjalan.
Solusi A — Gunakan SQLite (lebih mudah):
Edit prenament/settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}Solusi B — Start MySQL Laragon:
- Buka aplikasi Laragon
- Klik tombol Start All
- Tunggu MySQL menjadi Running (lampu hijau)
- Jalankan ulang
python manage.py migrate
Penyebab: Tag Django template {% if %} atau {% for %} tidak ditutup dengan {% endif %} / {% endfor %}.
Cara debug:
python manage.py checkSolusi: Buka file template yang disebutkan di traceback dan pastikan setiap {% if %} punya pasangan {% endif %}, setiap {% for %} punya {% endfor %}.
Penyebab: Field paritas di model adalah IntegerField. Template harus mengirim nilai angka, bukan string.
Solusi: Pastikan option select di template menggunakan value angka:
<option value="0">Hamil pertama kali (Primigravida)</option>
<option value="1">Hamil kedua (Secundigravida)</option>
<option value="2">Hamil ketiga atau lebih (Multigravida)</option>Penyebab: Paket mysqlclient belum terpasang.
Solusi:
pip install mysqlclient==2.2.0Jika gagal di Windows karena build error:
pip install mysqlclient --only-binary=:all:Penyebab: Database MySQL prenament belum dibuat.
Solusi:
C:\laragon\bin\mysql\mysql-8.4.3-winx64\bin\mysql.exe -u root -e "CREATE DATABASE prenament CHARACTER SET utf8mb4;"Penyebab A: DEBUG=False tapi collectstatic belum dijalankan.
python manage.py collectstatic --noinputPenyebab B: Path STATICFILES_DIRS salah. Verifikasi di settings.py:
STATICFILES_DIRS = [BASE_DIR / 'static'] # Folder harus ada
STATIC_ROOT = BASE_DIR / 'staticfiles' # Untuk collectstaticPenyebab: Tabel django_session belum ada (migrasi belum dijalankan).
Solusi:
python manage.py migrate# Cari proses yang memakai port 8000
netstat -ano | findstr :8000
# Kill proses (ganti PID dengan nomor yang ditemukan)
taskkill /PID 12345 /F
# Atau gunakan port lain
python manage.py runserver 8001Penyebab: Ibu hamil belum terdaftar ke kader (field kader di IbuProfil kosong/null).
Solusi:
- Jalankan ulang seed:
python manage.py seed(data baru otomatis ter-assign) - Atau assign manual via Admin Django:
/admin/ibu/ibuprofil/→ pilih ibu → set field Kader
- Ganti
SECRET_KEYdengan nilai acak yang kuat (min 50 karakter) - Set
DEBUG = False - Update
ALLOWED_HOSTSdengan domain/IP server yang spesifik - Gunakan MySQL (bukan SQLite)
- Set
SESSION_COOKIE_SECURE = Truejika menggunakan HTTPS - Jalankan
python manage.py collectstatic - Konfigurasi web server (Nginx/Apache) untuk serve
/static/dan/media/ - Gunakan Gunicorn atau uWSGI sebagai WSGI server
import os
DEBUG = False
SECRET_KEY = os.environ.get('SECRET_KEY', 'ganti-dengan-key-acak-production')
ALLOWED_HOSTS = [
'prenament.puskesmaslansot.id',
'www.prenament.puskesmaslansot.id',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ.get('DB_NAME', 'prenament'),
'USER': os.environ.get('DB_USER', 'prenament_user'),
'PASSWORD': os.environ.get('DB_PASS', ''),
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000pip install gunicorn
# Jalankan dengan 4 worker
gunicorn prenament.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 4 \
--access-logfile /var/log/prenament/access.log \
--error-logfile /var/log/prenament/error.log \
--daemonserver {
listen 80;
server_name prenament.puskesmaslansot.id;
# Serve static files langsung tanpa lewat Django
location /static/ {
alias /var/www/prenament/staticfiles/;
expires 30d;
}
location /media/ {
alias /var/www/prenament/media/;
expires 30d;
}
# Forward semua request lain ke Gunicorn
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}| Atribut | Nilai |
|---|---|
| Nama Aplikasi | PRENAMENT |
| Kepanjangan | Sahabat Kesehatan Mental Ibu Hamil di Era Digital |
| Lokasi | Puskesmas Lansot, Kota Tomohon, Sulawesi Utara |
| Bahasa Antarmuka | Bahasa Indonesia |
| Django Version | 4.2 LTS |
| Python Version | 3.11+ |
| Database Dev | SQLite 3 |
| Database Production | MySQL 8.4 |
| Skrining | PRAQ-R2 (Pregnancy-Related Anxiety Questionnaire Revised 2) |
| Total Halaman | 22 halaman (1 login + 7 ibu + 7 kader + 6 petugas + 1 admin) |
| Total URL | 24 URL endpoint |
| Format Tampilan | Mobile-first, 390px portrait |
Dikembangkan untuk Puskesmas Lansot, Kota Tomohon — 2026
