diff --git a/search/search_index.json b/search/search_index.json index 7ddf793..1dbcb5c 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Beranda","text":"

Selamat datang di Pemrograman Berbasis Platform Semester Genap 2023/2024. Situs web ini akan memuat informasi terkait dengan perkuliahan yang akan dipublikasikan secara rutin, seperti dokumen tutorial, tugas individu, dan tugas kelompok. Harap cek situs web ini secara berkala.

"},{"location":"#dosen","title":"Dosen","text":"

Arawinda Dinakaramani, S.Kom., M.Hum.

"},{"location":"#asisten-dosen","title":"Asisten Dosen","text":"
  1. Muhammad Iqbal Dwitama (MID) - Koordinator Asisten Dosen
  2. Muhammad Nabil Mu'afa (BIL)
"},{"location":"tk/pts/","title":"Proyek Tengah Semester PBP","text":"

Membuat Situs Web menggunakan Framework Django (Berkelompok)

"},{"location":"tk/pts/#tujuan-pembelajaran-khusus","title":"Tujuan Pembelajaran Khusus","text":"
  1. Merancang halaman web
  2. Mengimplementasikan website menggunakan framework Django dengan memenuhi Models, Views, dan Templates
  3. Memanfaatkan framework CSS untuk mewujudkan Responsive Web Design
  4. Mengimplementasikan Unit Test & deployment (bonus)
"},{"location":"tk/pts/#catatan","title":"Catatan","text":"

Perlu diperhatikan selain tujuan pembelajaran khusus seperti tertulis di atas, peserta kuliah juga perlu mempelajari dan dilatih beberapa aspek kecendekiaan sebagai calon sarjana. Di antaranya yang relevan dalam kuliah ini adalah keteguhan (grit), kemandirian, ketelitian, termasuk juga metakognitif (secara sederhana bisa diartikan kemampuan mengatur strategi belajar yang sesuai dengan dirinya meliputi perencanaan, monitoring dan evaluasi proses belajar mandiri), termasuk di dalamnya kemampuan untuk memahami, mengkomunikasikan masalah, diskusi dan bertanya, sehingga peserta kuliah juga perlu siap bersikap positif dengan kondisi-kondisi yang secara tidak langsung atau tidak pasti akan dihadapi dan mungkin dapat menghabiskan banyak waktu. Kondisi tersebut bisa dianggap kendala, seperti keterbatasan sumber daya, bug tools, kesulitan teknis atau lainnya. Walaupun dirasakan menyulitkan, perlu diupayakan untuk disikapi dengan positif agar dapat menjadi manfaat terkait aspek kecendekiaan yang perlu dilatih peserta kuliah. Sikap negatif hanya akan memperburuk keadaan dan menghilangkan manfaat tugas ini untuk pembelajaran yang akan dapat dirasakan di kemudian hari. Tim asisten dan dosen melalui sarana yang ada, akan berusaha semampunya melayani pertanyaan, keluhan, dan membantu proses pembelajaran peserta agar peserta bisa menjalani perkuliahan dan belajar semaksimal mungkin.

Sebagai selingan, bila rekan-rekan lelah dan bingung menghadapi error yang belum kunjung terselesaikan, berikut ini ada video yang cukup populer dan mudah-mudahan bisa menambah semangat untuk tetap teguh mengerjakan dan berlatih demi kesuksesan di kemudian hari.

Selamat mengerjakan. \ud83d\ude04

"},{"location":"tk/pts/#aturan-umum-tugas-kelompok","title":"Aturan Umum Tugas Kelompok","text":"
  1. Satu kelompok terdiri atas 5-6 orang.
  2. Satu kelompok membuat satu repositori Git di dalam satu organisasi yang digunakan oleh seluruh anggota kelompok untuk bekerja sama. Kumpulkan tautan repositori ke Scele.
  3. Setiap kelompok dipersilakan mencari ide sendiri mengenai aplikasi yang akan dibuat. Tema aplikasi adalah makanan dan minuman (food and beverage). Tema ini dipilih karena tiga alasan:
  4. Setiap kelompok mengimplementasikan dataset makanan dan minuman dalam bentuk class Models dan menyimpan data dari dataset tersebut ke dalam database Django. Dataset makanan dan minuman harus berisi minimal 100 makanan dan/atau minuman. Sumber dataset makanan dan minuman boleh berasal dari mana saja, misalnya dari Kaggle. Contoh URL dataset yang dapat digunakan:
  5. Setiap anggota kelompok mengerjakan modul yang berbeda. Modul ditentukan oleh kelompok yang disesuaikan dengan ide aplikasi yang sudah didiskusikan dalam kelompok.
  6. Tugas kelompok dikumpulkan sebagai kesatuan aplikasi web.
"},{"location":"tk/pts/#aturan-khusus-per-anggota-kelompok","title":"Aturan Khusus per Anggota Kelompok","text":"
  1. Menerapkan Models dengan membuat, memanfaatkan yang sudah disediakan Django, atau memanfaatkan yang sudah dibuat oleh anggota kelompok (di modul lain).
  2. Menerapkan Views untuk memproses request dan mengolah data untuk menghasilkan respons menggunakan templat HTML maupun mengembalikan respons JSON.
  3. Menerapkan templat HTML dengan kerangka yang sistematis dan efisien, seperti base.html, header.html, dan footer.html.
  4. Menerapkan responsive framework pada templat HTML (seperti Bootstrap atau Tailwind).
  5. Memiliki halaman form yang dapat menerima masukan dari pengguna kemudian diproses oleh Views. Contoh pemrosesan oleh Views adalah insert data ke dalam Models, query data dari Models, dan update data pada Models.
  6. Menerapkan JavaScript dengan pemanggilan AJAX.
  7. Menerapkan filter informasi bagi pengguna yang sudah log in saja. Contohnya adalah data alamat, umur, dan nomor ponsel hanya dapat dilihat oleh pengguna yang sudah log in saja.
  8. Menerapkan filter pada dataset makanan dan minuman yang ditampilkan. Contohnya adalah menampilkan daftar makanan dan minuman berdasarkan harga.
"},{"location":"tk/pts/#tahapan-tugas-kelompok","title":"Tahapan Tugas Kelompok","text":"

Tahapan dan deliverables Tenggat Waktu dan Keterangan Tahap I (40%)

Tenggat Waktu: Rabu, 13 Maret 2024, pukul 23:55 WIB Kumpulkan tautan GitHub dengan code base proyek Django yang sudah disiapkan di GitHub ke slot submisi yang tersedia di SCELE. Tahap II (60%)

(Modul sudah terimplementasi dengan baik)

Tenggat Waktu: Rabu, 17 April 2024, pukul 23.55 WIB

Kriteria Submisi: Seluruh modul yang dikerjakan oleh setiap anggota kelompok sudah muncul dan dapat diakses pada proyek Django

Bonus (5%)

"},{"location":"tugas/tugas-1/","title":"Tugas 1: Menulis Esai","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-1/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Tulislah sebuah esai minimal 1000 kata yang mengandung poin-poin sebagai berikut.

  1. Pilihlah salah satu platform yang telah dijelaskan dalam Slide 1. Sebutkan nama platform yang Anda pilih.

  2. Sebutkan 3 perangkat dan teknologi yang tergolong dalam platform tersebut yang pernah Anda gunakan.

  3. Untuk masing-masing perangkat dan teknologi yang Anda sebutkan, ceritakan pengalaman Anda saat\u00a0menggunakannya.

  4. Menurut Anda, apakah ada satu platform yang paling penting di antara semua programming platform? Jika ada, platform apa dan mengapa platform tersebut paling penting? Jika tidak ada, jelaskan\u00a0alasannya!

"},{"location":"tugas/tugas-1/#pengumpulan","title":"Pengumpulan","text":"

Tugas dikumpulkan dalam format Portable Document File (*.pdf) dengan ketentuan nama berkas NPM_Nama_Tugas 1.pdf.

"},{"location":"tugas/tugas-1/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 1 adalah hari Selasa, 6 Februari 2024, pukul 12.00 siang.

Harap mengumpulkan esai yang telah kamu buat ke dalam slot submisi yang telah disediakan di SCELE.

"},{"location":"tugas/tugas-1/#rubrik-penilaian","title":"Rubrik Penilaian","text":"
  1. Orisinalitas karya dan keatraktifan judul (10 poin)
  2. Format penulisan (10 poin)
  3. Penggunaan bahasa Indonesia yang baik dan benar (15 poin)
  4. Ketajaman analisis permasalahan (30 poin)
  5. Kelengkapan konten esai (15 poin)
  6. Simpulan dan saran (15 poin)
  7. Referensi (5 poin)
"},{"location":"tugas/tugas-2/","title":"Tugas 2: Implementasi Model-View-Template (MVT) pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-2/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan konsep Model-View-Template serta beberapa hal yang sudah kamu pelajari di kelas dan tutorial. Perlu diperhatikan bahwa proyek yang dibuat pada tugas berbeda dengan proyek yang digunakan pada tutorial.

"},{"location":"tugas/tugas-2/#tema-aplikasi","title":"Tema Aplikasi","text":"

Tema besar aplikasi untuk tugas PBP adalah aplikasi tracker. Pada semester ini, kamu diberikan kebebasan dalam memilih nama dan tema kecil aplikasi, kecuali book tracker yang sudah digunakan pada tutorial. Namun, aplikasi dari tugas kamu harus memiliki atribut-atribut berikut pada model aplikasimu.

Kamu dipersilakan untuk menambahkan atribut lainnya jika diinginkan, seperti date, category. Namun, model aplikasi kamu wajib memiliki ketiga atribut wajib di atas (name, amount, description). Nama dari ketiga atribut di atas dapat disesuaikan lagi dengan kebutuhan aplikasimu.

Beberapa contoh ide aplikasi pengelolaan yang dapat kamu buat adalah sebagai berikut.

"},{"location":"tugas/tugas-2/#checklist-tugas","title":"Checklist Tugas","text":"

Checklist untuk tugas ini adalah sebagai berikut.

Perhatikan bahwa kamu harus mengerjakan tugas ini menggunakan repositori yang berbeda dengan tutorial.

"},{"location":"tugas/tugas-2/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 2 adalah hari Selasa, 13 Februari, pukul 12.00 siang.

Harap mengumpulkan link repositori yang kamu gunakan ke dalam slot submisi yang telah disediakan di SCELE.

"},{"location":"tugas/tugas-3/","title":"Tugas 3: Implementasi Form dan Data Delivery pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-3/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan menjalankan implementasi konsep data delivery serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-3/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 3 adalah hari Selasa, 20 Februari, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-4/","title":"Tugas 4: Implementasi Autentikasi, Session, dan Cookies pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-4/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan konsep authentication, session, cookies, serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.

Kerjakan checklist untuk tugas ini secara berurutan:

"},{"location":"tugas/tugas-4/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 4 adalah Selasa, 27 Februari 2023, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-5/","title":"Tugas 5: Desain Web menggunakan HTML, CSS dan Framework CSS","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-5/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan desain web berdasarkan beberapa hal yang sudah kamu pelajari selama tutorial (CSS, Framework, dsb).

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-5/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 5 adalah Selasa, 5 Maret, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-6/","title":"Tugas 6: JavaScript dan Asynchronous JavaScript","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-6/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan AJAX pada aplikasi yang telah kamu buat pada tugas sebelumnya.

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-6/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 6 adalah Jumat, 15 Maret 2024, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tutorial/tutorial-0/","title":"Tutorial 0: Konfigurasi dan Instalasi Git dan Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Ganjil 2023/2024

"},{"location":"tutorial/tutorial-0/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-0/#tutorial-pembuatan-akun-github-lewati-jika-sudah-ada","title":"Tutorial: Pembuatan Akun GitHub (Lewati Jika Sudah Ada)","text":""},{"location":"tutorial/tutorial-0/#pengenalan-tentang-git-dan-github","title":"Pengenalan Tentang Git dan GitHub","text":"

Pengenalan awal ini akan membantumu memahami dasar-dasar mengenai Git dan platform berbasis web yang dikenal sebagai GitHub.

"},{"location":"tutorial/tutorial-0/#git-sistem-kontrol-versi-yang-kuat","title":"Git: Sistem Kontrol Versi yang Kuat","text":""},{"location":"tutorial/tutorial-0/#github-platform-kolaborasi-menggunakan-git","title":"GitHub: Platform Kolaborasi Menggunakan Git","text":""},{"location":"tutorial/tutorial-0/#mengapa-penting","title":"Mengapa Penting?","text":"

Dengan pemahaman dasar mengenai Git dan GitHub, kamu siap untuk melangkah lebih jauh dalam dunia pengembangan perangkat lunak yang kolaboratif dan terstruktur.

"},{"location":"tutorial/tutorial-0/#langkah-1-membuat-akun-di-github","title":"Langkah 1: Membuat Akun di GitHub","text":"

Langkah selanjutnya adalah membuat akun di GitHub, yang akan memungkinkanmu untuk mulai berkolaborasi pada proyek-proyek menggunakan Git.

  1. Buka Situs Web GitHub

  2. Membuat Akun

  3. Isi Formulir Pendaftaran

  4. Verifikasi Akun Melalui Email

  5. Akun GitHub Siap Digunakan

Catatan:

"},{"location":"tutorial/tutorial-0/#selamat-kamu-telah-membuat-akun-github","title":"Selamat, Kamu Telah Membuat Akun GitHub","text":"

Kamu sekarang telah memiliki akun GitHub yang dapat digunakan untuk menyimpan proyek, berkolaborasi dengan orang lain, dan masih banyak lagi.

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-ide","title":"Tutorial: Instalasi IDE","text":"

IDE (Integrated Development Environment) adalah perangkat lunak yang membantu para pengembang dalam menulis, mengedit, dan mengelola kode. Berikut adalah langkah-langkah untuk memasang IDE.

"},{"location":"tutorial/tutorial-0/#langkah-1-pemilihan-text-editor-atau-ide","title":"Langkah 1: Pemilihan Text Editor atau IDE","text":"

Pilihlah text editor atau IDE yang sesuai dengan preferensimu. Beberapa pilihan populer yang dapat kamu pertimbangkan meliputi:

"},{"location":"tutorial/tutorial-0/#langkah-2-proses-instalasi","title":"Langkah 2: Proses Instalasi","text":"
  1. Pergi ke situs web resmi IDE yang kamu pilih.
  2. Ikuti petunjuk yang diberikan untuk mengunduh installer IDE.
  3. Jalankan installer dan ikuti instruksi di layar untuk menyelesaikan proses instalasi.
"},{"location":"tutorial/tutorial-0/#langkah-3-memulai-menggunakan-ide","title":"Langkah 3: Memulai Menggunakan IDE","text":"
  1. Setelah proses instalasi selesai, buka IDE yang telah terinstal.
  2. Eksplorasi antarmuka dan fitur yang disediakan oleh IDE untuk membantumu dalam pengembangan proyek.

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-dan-konfigurasi-git","title":"Tutorial: Instalasi dan Konfigurasi Git","text":""},{"location":"tutorial/tutorial-0/#langkah-1-instalasi-git","title":"Langkah 1: Instalasi Git","text":"

Jika Git belum terpasang pada sistem, kamu dapat mengikuti langkah-langkah berikut untuk menginstalnya.

  1. Buka situs web resmi Git di sini.
  2. Pilih sistem operasi yang sesuai (Windows, macOS, atau Linux) dan unduh installer yang sesuai.
  3. Jalankan installer yang telah diunduh dan ikuti petunjuk di layar untuk menyelesaikan proses instalasi.
"},{"location":"tutorial/tutorial-0/#langkah-2-konfigurasi-awal-git","title":"Langkah 2: Konfigurasi Awal Git","text":"

Setelah Git terpasang, langkah-langkah berikut akan membantumu mengatur konfigurasi awal sebelum mulai menggunakan Git.

  1. Buatlah sebuah folder/direktori baru untuk menyimpan proyek Git kamu, kemudian masuklah ke direktori tersebut.
  2. Salinlah path ke direktori yang sudah kamu buat.
  3. Buka terminal atau command prompt pada sistem, kemudian pindah ke direktori yang sudah kamu buat dengan menjalankan perintah cd <path_direktori>
  4. Inisiasi repositori baru dengan perintah git init. Perintah ini akan membuat repositori Git kosong di dalam direktori yang kamu tentukan.
"},{"location":"tutorial/tutorial-0/#langkah-3-konfigurasi-nama-pengguna-dan-email","title":"Langkah 3: Konfigurasi Nama Pengguna dan Email","text":"

Sebelum mulai berkontribusi ke repositori, konfigurasikan nama pengguna dan alamat email agar terhubung dengan commit-mu.

Atur username dan email yang akan diasosiasikan dengan pekerjaanmu ke repositori Git ini dengan menjalankan perintah di bawah ini. Sesuaikan dengan username dan email yang kamu gunakan pada GitHub.

git config --global user.name \"<NAME>\"\ngit config --global user.email \"<EMAIL>\"\n

Contoh:

git config --global user.name \"pakbepe\"\ngit config --global user.email \"pak.bepe@cs.ui.ac.id\"\n

Perlu diketahui bahwa flag --global akan mengubah konfigurasi global untuk seluruh sistem.

"},{"location":"tutorial/tutorial-0/#langkah-4-verifikasi-konfigurasi","title":"Langkah 4: Verifikasi Konfigurasi","text":"

Untuk memastikan konfigurasi telah diatur dengan benar pada repositori lokal, kamu dapat menjalankan perintah berikut.

git config --list\n

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-penggunaan-dasar-git","title":"Tutorial: Penggunaan Dasar Git","text":"

Repositori adalah tempat penyimpanan untuk proyek perangkat lunak, yang mencakup semua revisi dan perubahan yang telah dilakukan pada kode. Untuk mengeksekusi perintah-perintah Git, kamu dapat melakukannya pada repositori di GitHub, platform kolaboratif untuk mengelola proyek menggunakan Git.

"},{"location":"tutorial/tutorial-0/#langkah-1-melakukan-inisiasi-repositori-di-github","title":"Langkah 1: Melakukan Inisiasi Repositori di GitHub","text":"

Langkah pertama dalam penggunaan Git adalah melakukan inisiasi repositori di GitHub untuk memulai pelacakan perubahan pada proyekmu.

  1. Buka GitHub melalui peramban web.

  2. Buat Repositori Baru

  3. Tentukan Direktori Lokal

  4. Tambahkan Berkas README.md

  5. Cek Status dan Lakukan Tracking

  6. Commit Perubahan

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-2-menghubungkan-repositori-lokal-dengan-repositori-di-github","title":"Langkah 2: Menghubungkan Repositori Lokal dengan Repositori di GitHub","text":"

Setelah melakukan inisiasi repositori lokal, langkah selanjutnya adalah menghubungkannya dengan repositori di GitHub agar kamu dapat berkolaborasi dan menyimpan perubahan di platform daring tersebut.

  1. Buat Branch Utama Baru

  2. Hubungkan dengan Repositori di GitHub

  3. Lakukan Penyimpanan Pertama ke GitHub

  4. Lakukan Pengecekan Kembali

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-3-melakukan-cloning-terhadap-suatu-repositori","title":"Langkah 3: Melakukan Cloning terhadap Suatu Repositori","text":"

Cloning repositori adalah proses menduplikasi seluruh konten dari repositori yang ada di platform GitHub ke komputer lokal. Langkah-langkahnya adalah sebagai berikut.

  1. Buka halaman repositori di GitHub yang telah kamu buat sebelumnya.

  2. Salin URL Clone

  3. Clone Repositori ke Komputer Lokal

Saat ini, kamu memiliki tiga repositori:

  1. Repositori asli di komputer lokal.
  2. Repositori daring di GitHub yang terhubung dengan repositori lokal.
  3. Repositori baru hasil dari proses cloning yang terhubung dengan repositori GitHub.

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-4-melakukan-push-kepada-suatu-repositori","title":"Langkah 4: Melakukan Push kepada Suatu Repositori","text":"

Seperti yang sudah disinggung sebelumnya (Langkah 2), push adalah proses mengirimkan perubahan yang kamu lakukan di repositori lokal ke repositori di GitHub. Langkah-langkahnya adalah sebagai berikut.

  1. Buka kembali repositori lokal yang pertama kali kamu buat.

  2. Ubah isi berkas README.md dengan menambahkan atribut Hobi. Contohnya adalah sebagai berikut.

    Nama : Pak Bepe\n\nNPM : 2201234567\n\nKelas : PBP A\n\nHobi : Tidur\n
  3. Lakukan Push ke Repositori GitHub

  4. Lakukan Pengecekan Kembali

Catatan: Jika kamu ingin mengambil semua perubahan yang belum di-stage (ditandai untuk dimasukkan dalam commit) dari seluruh direktori proyek kamu, jalankan git add ..

"},{"location":"tutorial/tutorial-0/#langkah-5-melakukan-pull-dari-suatu-repositori","title":"Langkah 5: Melakukan Pull dari Suatu Repositori","text":"

Pull pada suatu repositori adalah proses mengambil perubahan terbaru dari repositori di GitHub dan menggabungkannya dengan repositori lokal.

  1. Buka kembali repositori lokal yang telah kamu clone sebelumnya di terminal atau command prompt.

  2. Jalankan Perintah Pull

  3. Lakukan Pengecekan Kembali

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-6-melakukan-branching-pada-suatu-repositori","title":"Langkah 6: Melakukan Branching pada Suatu Repositori","text":"

Pada tahap ini kamu akan mempelajari tentang penggunaan branch dalam Git. Penggunaan branch memungkinkan kamu untuk mengembangkan fitur atau memperbaiki bug di lingkungan terpisah sebelum menggabungkannya kembali ke branch utama.

Apa Itu Branch di Git?

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-django-dan-inisiasi-proyek-django","title":"Tutorial: Instalasi Django dan Inisiasi Proyek Django","text":"

Django adalah kerangka kerja (framework) yang populer untuk pengembangan aplikasi web dengan bahasa pemrograman Python. Dalam tutorial ini, kamu akan mempelajari langkah-langkah instalasi Django dan inisiasi proyek demo sebagai starter.

"},{"location":"tutorial/tutorial-0/#langkah-1-membuat-direktori-dan-mengaktifkan-virtual-environment","title":"Langkah 1: Membuat Direktori dan Mengaktifkan Virtual Environment","text":"
  1. Buat direktori baru dengan nama book-tracker dan masuk ke dalamnya.
  2. Di dalam direktori tersebut, buka command prompt (Windows) atau terminal shell (Unix).
  3. Buat virtual environment dengan menjalankan perintah berikut.

    python -m venv env\n
  4. Virtual environment ini berguna untuk mengisolasi package serta dependencies dari aplikasi agar tidak bertabrakan dengan versi lain yang ada pada komputermu. Kamu dapat mengaktifkan virtual environment dengan perintah berikut.

  5. Virtual environment akan aktif dan ditandai dengan (env) di baris input terminal.

"},{"location":"tutorial/tutorial-0/#langkah-2-menyiapkan-dependencies-dan-membuat-proyek-django","title":"Langkah 2: Menyiapkan Dependencies dan Membuat Proyek Django","text":"

Dependencies adalah komponen atau modul yang diperlukan oleh suatu perangkat lunak untuk berfungsi, termasuk library, framework, atau package. Hal tersebut memungkinkan pengembang memanfaatkan kode yang telah ada, mempercepat pengembangan, tetapi juga memerlukan manajemen yang hati-hati untuk memastikan kompatibilitas versi yang tepat. Penggunaan virtual environment membantu mengisolasi dependencies antara proyek-proyek yang berbeda.

  1. Di dalam direktori yang sama, buat berkas requirements.txt dan tambahkan beberapa dependencies.

    django\ngunicorn\nwhitenoise\npsycopg2-binary\nrequests\nurllib3\n
  2. Lakukan instalasi terhadap dependencies yang ada dengan perintah berikut. Jangan lupa jalankan virtual environment terlebih dahulu sebelum menjalankan perintah berikut.

    pip install -r requirements.txt\n
  3. Buat proyek Django bernama book_tracker dengan perintah berikut.

    django-admin startproject book_tracker .\n

    Pastikan karakter . tertulis di akhir perintah

"},{"location":"tutorial/tutorial-0/#langkah-3-konfigurasi-proyek-dan-menjalankan-server","title":"Langkah 3: Konfigurasi Proyek dan Menjalankan Server","text":"
  1. Tambahkan * pada ALLOWED_HOSTS di settings.py untuk keperluan deployment:

    ...\nALLOWED_HOSTS = [\"*\"]\n...\n

Dalam konteks deployment, ALLOWED_HOSTS berfungsi sebagai daftar host yang diizinkan untuk mengakses aplikasi web. Dengan menetapkan nilai [\"*\"], kamu mengizinkan akses dari semua host, yang akan memungkinkan aplikasi diakses secara luas. Namun, perlu diingat bahwa pengaturan ini harus digunakan dengan bijak dan hanya dalam situasi tertentu, seperti saat melakukan uji coba atau tahap awal pengembangan.

  1. Pastikan bahwa berkas manage.py ada pada direktori yang aktif pada terminal kamu saat ini. Jalankan server Django dengan perintah:

  2. Buka http://localhost:8000 pada peramban web untuk melihat animasi roket sebagai tanda aplikasi Django kamu berhasil dibuat.

"},{"location":"tutorial/tutorial-0/#langkah-4-menghentikan-server-dan-menonaktifkan-virtual-environment","title":"Langkah 4: Menghentikan Server dan Menonaktifkan Virtual Environment","text":"
  1. Untuk menghentikan server, tekan Ctrl+C (Windows/Linux) atau Control+C (Mac) pada terminal.
  2. Nonaktifkan virtual environment dengan perintah:

    deactivate\n

    Selamat! Kamu telah berhasil membuat aplikasi Django dari awal.

"},{"location":"tutorial/tutorial-0/#tutorial-unggah-proyek-ke-repositori-github","title":"Tutorial: Unggah Proyek ke Repositori GitHub","text":"
  1. Buatlah repositori GitHub baru bernama book-tracker dengan visibilitas public.

  2. Inisiasi direktori lokal book-tracker sebagai repositori Git.

    Hint: Ingat kembali tahap tutorial sebelumnya

  3. Tambahkan Berkas .gitignore

  4. Lakukan add, commit, dan push dari direktori repositori lokal.

Catatan:

"},{"location":"tutorial/tutorial-0/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu sudah menyelesaikan tutorial tentang penggunaan Git, GitHub, instalasi IDE, dan pengembangan proyek dengan Django.

Pesan tambahan, pastikan kamu memahami setiap kode yang kamu tulis, ya. Jangan sampai hanya asal copy-paste tanpa memahaminya terlebih dahulu. Apabila nanti kamu mengalami kesulitan, jangan ragu untuk bertanya ke asisten dosen ataupun teman. Semangat terus dalam menjalani perkuliahan PBP selama satu semester ke depan, dan jangan lupa untuk menikmati setiap prosesnya. Good luck!

"},{"location":"tutorial/tutorial-0/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-0/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-0/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-1/","title":"Tutorial 1: Pengenalan Aplikasi Django dan Model-View-Template (MVT) pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-1/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-1/#ringkasan-hasil-tutorial-0","title":"Ringkasan Hasil Tutorial 0","text":"

Untuk membantumu mengerjakan tutorial 1 dengan baik, kami mengharapkan hasil pengerjaan tutorial 0 sebagai berikut.

  1. Pada komputer lokal, terdapat direktori utama book-tracker yang telah diinisiasi sebagai repositori lokal.
  2. Pada direktori utama book-tracker tersebut, terdapat beberapa berkas dan subdirektori berikut.

  3. Subdirektori env.

  4. Subdirektori proyek book_tracker. Berbeda dengan direktori utama, subdirektori ini terbentuk setelah menjalankan perintah

    django-admin startproject book_tracker .\n
  5. Berkas .gitignore.

  6. Berkas manage.py.
  7. Berkas requirements.txt.
  8. (Opsional) Berkas db.sqlite3.

Struktur proyek book-tracker pada direktori lokal adalah sebagai berikut.

  1. Pada repositori GitHub, pastikan repositori book-tracker memiliki berkas dan direktori berikut.

  2. Direktori proyek book_tracker. Direktori ini hasil menjalankan perintah

    django-admin startproject book_tracker .\n
  3. Berkas .gitignore.

  4. Berkas manage.py.
  5. Berkas requirements.txt.

Struktur proyek book-tracker pada repositori GitHub adalah sebagai berikut.

"},{"location":"tutorial/tutorial-1/#pengenalan-mengenai-konsep-mvt","title":"Pengenalan Mengenai Konsep MVT","text":"

Dalam dunia pengembangan web, terdapat berbagai konsep dan arsitektur yang membantu dalam merancang dan mengembangkan aplikasi. Salah satu konsep yang umum digunakan adalah MVT (Model-View-Template).

"},{"location":"tutorial/tutorial-1/#apa-itu-konsep-mvt","title":"Apa Itu Konsep MVT?","text":"

MVT adalah singkatan dari Model-View-Template. MVT adalah sebuah konsep arsitektur yang digunakan dalam pengembangan web untuk memisahkan komponen-komponen utama dari sebuah aplikasi. Konsep ini memungkinkan pengembang web untuk mengorganisasi dan mengelola kode dengan lebih terstruktur.

"},{"location":"tutorial/tutorial-1/#apa-itu-model","title":"Apa Itu Model?","text":"

Model merupakan komponen dalam konsep MVT yang bertanggung jawab untuk mengatur dan mengelola data dari aplikasi. Model mewakili struktur data dan logika aplikasi yang berada di belakang tampilan. Model menghubungkan aplikasi dengan basis data dan mengatur interaksi dengan data tersebut.

"},{"location":"tutorial/tutorial-1/#apa-itu-view","title":"Apa Itu View?","text":"

View merupakan komponen yang menangani logika presentasi dalam konsep MVT. View mengontrol bagaimana data yang dikelola oleh model akan ditampilkan kepada pengguna. Dalam konteks MVT, view berperan sebagai pengatur tampilan dan mengambil data dari model untuk disajikan kepada pengguna.

"},{"location":"tutorial/tutorial-1/#apa-itu-template","title":"Apa Itu Template?","text":"

Template adalah komponen yang berfungsi untuk mengatur tampilan atau antarmuka pengguna. Template memisahkan kode HTML dari logika aplikasi. Dalam MVT, template digunakan untuk merancang tampilan yang akhirnya akan diisi dengan data dari model melalui view.

"},{"location":"tutorial/tutorial-1/#hubungan-antara-komponen-komponen-mvt","title":"Hubungan Antara Komponen-komponen MVT","text":"

Secara ringkas, konsep MVT berjalan dalam kerangka berikut:

"},{"location":"tutorial/tutorial-1/#manfaat-mvt","title":"Manfaat MVT","text":"

MVT memisahkan tugas antara logika aplikasi, tampilan, dan data, sehingga memungkinkan pengembang untuk bekerja pada setiap komponen secara terpisah.

Dengan pemisahan tugas yang jelas, kode menjadi lebih terorganisir dan mudah dikelola.

Kode dapat digunakan kembali dalam berbagai bagian aplikasi yang berbeda.

Struktur MVT mendukung skalabilitas dengan memungkinkan pengembangan paralel pada setiap komponen.

Catatan:

"},{"location":"tutorial/tutorial-1/#tutorial-membuat-aplikasi-django-beserta-konfigurasi-model","title":"Tutorial: Membuat Aplikasi Django beserta Konfigurasi Model","text":"

Dalam tutorial ini, akan dijelaskan mengenai konsep aplikasi dan proyek dalam Django.

Apa Itu Proyek dan Aplikasi dalam Django?

Sebelum dimulai, kamu perlu mengingat kembali bahwa direktori utama adalah direktori terluar, sedangkan direktori proyek adalah direktori di dalam direktori utama. Perlu diingat bahwa keduanya memiliki nama yang hampir sama. Direktori utama memiliki nama book-tracker, sementara itu direktori proyek memiliki nama book_tracker. Perbedaan hanya terletak pada penggunaan dash (-) dan underscore (_).

"},{"location":"tutorial/tutorial-1/#langkah-1-persiapan-awal","title":"Langkah 1: Persiapan Awal","text":"
  1. Buka direktori utama book-tracker.

  2. Sebelum memulai, pastikan kamu berada di direktori utama book-tracker yang telah dibuat pada tutorial sebelumnya.

  3. Di dalam direktori ini, kamu akan melanjutkan pengembangan proyek Django.

  4. Buka terminal atau command prompt dan pastikan direktori kerja kamu adalah direktori utama book-tracker.

  5. Aktifkan virtual environment yang telah dibuat sebelumnya. Jalankan perintah berikut sesuai dengan sistem operasi perangkat kamu.

  6. Windows:

    env\\Scripts\\activate.bat\n
  7. Unix (Linux & Mac OS):

    source env/bin/activate\n
"},{"location":"tutorial/tutorial-1/#langkah-2-membuat-aplikasi-main-dalam-proyek-book-tracker","title":"Langkah 2: Membuat Aplikasi main dalam Proyek Book Tracker","text":"

Kamu akan membuat aplikasi baru bernama main dalam proyek book tracker.

  1. Jalankan perintah berikut untuk membuat aplikasi baru.
python manage.py startapp main\n

Setelah perintah di atas dijalankan, akan terbentuk direktori baru dengan nama main yang akan berisi struktur awal untuk aplikasimu.

Mungkin kamu cukup bingung dengan istilah direktori utama, direktori proyek, atau direktori aplikasi. Akan tetapi, seiring berjalannya waktu, kamu pasti bisa!

  1. Daftarkan aplikasi main ke dalam proyek.

  2. Buka berkas settings.py di dalam direktori proyek book_tracker.

  3. Temukan variabel INSTALLED_APPS.
  4. Tambahkan 'main' ke dalam daftar aplikasi yang ada.

    INSTALLED_APPS = [\n    ...,\n    'main',\n    ...\n]\n

Dengan melakukan langkah-langkah tersebut, kamu telah mendaftarkan aplikasi main ke dalam proyek book tracker kamu sehingga proyekmu sudah mengenali bahwa terdapat aplikasi main yang dapat dijalankan.

"},{"location":"tutorial/tutorial-1/#tutorial-implementasi-template-dasar","title":"Tutorial: Implementasi Template Dasar","text":"

Kamu akan membuat template main.html di dalam direktori baru bernama templates pada aplikasi main. Template ini akan digunakan untuk menampilkan data book tracker kamu.

Saat ini, aplikasi book tracker belum menampilkan data apapun. Data akan ditampilkan pada tutorial selanjutnya.

"},{"location":"tutorial/tutorial-1/#langkah-1-membuat-dan-mengisi-berkas-mainhtml","title":"Langkah 1: Membuat dan Mengisi Berkas main.html","text":"

Sebelum mulai, mari pahami secara singkat mengenai HTML. HTML (Hypertext Markup Language) adalah penanda bahasa yang digunakan untuk membuat struktur dan tampilan konten pada halaman web.

Hint: Kamu akan mempelajari HTML lebih lanjut di tutorial 4.

  1. Buat direktori baru bernama templates di dalam direktori aplikasi main.

  2. Di dalam direktori templates, buat berkas baru bernama main.html dengan isi sebagai berikut. Gantilah nilai yang sesuai dengan data kamu.

<h1>Book Tracker Page</h1>\n\n<h5>Name:</h5>\n<p>Pak Bepe</p>\n<!-- Ubahlah sesuai dengan nama kamu -->\n<h5>Class:</h5>\n<p>PBP A</p>\n<!-- Ubahlah sesuai dengan kelas kamu -->\n
  1. Buka berkas HTML di web browser.

  2. Sebelum dihubungkan dengan aplikasi, cobalah membuka berkas main.html di web browser-mu.

  3. Perlu dicatat bahwa pada tahap ini hanya untuk memeriksa tampilan dasar HTML dan belum terhubung dengan Django.
  4. Berikut merupakan contoh tampilan HTML yang diharapkan.

"},{"location":"tutorial/tutorial-1/#tutorial-implementasi-model-dasar","title":"Tutorial: Implementasi Model Dasar","text":""},{"location":"tutorial/tutorial-1/#langkah-1-mengubah-berkas-modelspy-dalam-aplikasi-main","title":"Langkah 1: Mengubah Berkas models.py dalam Aplikasi main","text":"

Pada langkah ini, kamu akan mengubah berkas models.py yang terdapat di dalam direktori aplikasi main untuk mendefinisikan model baru.

  1. Buka berkas models.py pada direktori aplikasi main.

  2. Isi berkas models.py dengan kode berikut.

from django.db import models\n\nclass Book(models.Model):\n    name = models.CharField(max_length=255)\n    date_added = models.DateField(auto_now_add=True)\n    page = models.IntegerField()\n    description = models.TextField()\n

Penjelasan Kode:

"},{"location":"tutorial/tutorial-1/#langkah-2-membuat-dan-mengaplikasikan-migrasi-model","title":"Langkah 2: Membuat dan Mengaplikasikan Migrasi Model","text":"

Apa itu migrasi model?

Bagaimana cara melakukan migrasi model?

  1. Jalankan perintah berikut pada terminal atau command prompt di direktori utama untuk membuat migrasi model.
python manage.py makemigrations\n

makemigrations menciptakan berkas migrasi yang berisi perubahan model yang belum diaplikasikan ke dalam basis data.

  1. Masih di direktori utama, jalankan perintah berikut untuk menerapkan migrasi ke dalam basis data lokal.
python manage.py migrate\n

migrate mengaplikasikan perubahan model yang tercantum dalam berkas migrasi ke basis data.

Setiap kali kamu melakukan perubahan pada model, seperti menambahkan atau mengubah atribut, kamu perlu melakukan migrasi untuk merefleksikan perubahan tersebut.

"},{"location":"tutorial/tutorial-1/#tutorial-menghubungkan-view-dengan-template","title":"Tutorial: Menghubungkan View dengan Template","text":"

Dalam tutorial ini, kamu akan menghubungkan view dengan template menggunakan Django. Langkah-langkah ini akan menjelaskan bagaimana membuat fungsi view show_main dalam aplikasi main dan me-render template dengan data yang telah diambil dari model.

"},{"location":"tutorial/tutorial-1/#langkah-1-mengintegrasikan-komponen-mvt","title":"Langkah 1: Mengintegrasikan Komponen MVT","text":"

Kamu akan mengimpor modul yang diperlukan dan membuat fungsi view show_main.

  1. Buka berkas views.py yang terletak di dalam berkas aplikasi main.

  2. Tambahkan baris-baris impor berikut di bagian paling atas berkas apabila belum ada.

from django.shortcuts import render\n

Penjelasan Kode:

from django.shortcuts import render berguna untuk mengimpor fungsi render dari modul django.shortcuts. Fungsi render digunakan untuk me-render tampilan HTML dengan menggunakan data yang diberikan.

  1. Tambahkan fungsi show_main di bawah impor:
def show_main(request):\n    context = {\n        'name': 'Pak Bepe',\n        'class': 'PBP A'\n    }\n\n    return render(request, \"main.html\", context)\n

Penjelasan Kode:

"},{"location":"tutorial/tutorial-1/#langkah-2-modifikasi-template","title":"Langkah 2: Modifikasi Template","text":"

Sekarang, kamu akan mengubah template main.html agar dapat menampilkan data yang telah diambil dari model.

  1. Buka berkas main.html yang telah dibuat sebelumnya dalam direktori templates pada direktori main.

  2. Ubah nama dan kelas yang sebelumnya dibuat secara statis menjadi kode Django yang sesuai untuk menampilkan data.

...\n<h5>Name:</h5>\n<p>{{ name }}</p>\n<p></p>\n<h5>Class:</h5>\n<p>{{ class }}</p>\n

Penjelasan Kode:

Sintaks Django {{ name }} dan {{ class }} digunakan untuk menampilkan nilai dari variabel yang telah didefinisikan dalam context.

"},{"location":"tutorial/tutorial-1/#tutorial-mengonfigurasi-routing-url","title":"Tutorial: Mengonfigurasi Routing URL","text":"

Kamu akan mengatur routing URL agar aplikasi main dapat diakses melalui web browser.

"},{"location":"tutorial/tutorial-1/#langkah-1-mengonfigurasi-routing-url-aplikasi-main","title":"Langkah 1: Mengonfigurasi Routing URL Aplikasi main","text":"
  1. Buatlah berkas baru bernamaurls.py di dalam direktori main.
  2. Isi urls.py dengan kode berikut.
from django.urls import path\nfrom main.views import show_main\n\napp_name = 'main'\n\nurlpatterns = [\n    path('', show_main, name='show_main'),\n]\n

Penjelasan Kode dalam urls.py pada Aplikasi main:

"},{"location":"tutorial/tutorial-1/#langkah-2-mengonfigurasi-routing-url-proyek","title":"Langkah 2: Mengonfigurasi Routing URL Proyek","text":"

Kamu akan menambahkan rute URL dalam urls.py pada proyek untuk menghubungkannya ke tampilan main.

  1. Buka berkas urls.py di dalam direktori proyek book_tracker, bukan yang ada di dalam direktori aplikasi main.
  2. Impor fungsi include dari django.urls.
...\nfrom django.urls import path, include\n...\n
  1. Tambahkan rute URL seperti berikut untuk mengarahkan ke tampilan main di dalam variabel urlpatterns.
urlpatterns = [\n    ...\n    path('', include('main.urls')),\n    ...\n]\n

Penjelasan:

Sebagai bayangan, apabila kamu menggunakan path 'main/' pada contoh di atas, maka kamu perlu mengakses halaman http://localhost:8000/main/ untuk mengakses halaman aplikasi main. Karena path yang ditentukan adalah '', maka kamu dapat mengakses aplikasi main melalui URL http://localhost:8000/ saja.

  1. Jalankan proyek Django dengan menjalankan perintah python manage.py runserver pada terminal atau command prompt di direktori utama.

  2. Bukalah http://localhost:8000/ di web browser favoritmu untuk melihat halaman yang sudah kamu buat.

Dengan langkah-langkah di atas, kamu telah berhasil mengimplementasikan tampilan dasar dalam aplikasi main dan menghubungkannya dengan rute URL proyek. Pastikan kamu memahami setiap langkah dan informasi yang diberikan untuk mengaktifkan tampilan dalam proyek Django-mu

"},{"location":"tutorial/tutorial-1/#apa-bedanya-urlspy-pada-aplikasi-dan-urlspy-pada-proyek","title":"Apa bedanya urls.py pada aplikasi dan urls.py pada proyek?","text":""},{"location":"tutorial/tutorial-1/#tutorial-pengenalan-django-unit-testing","title":"Tutorial: Pengenalan Django Unit Testing","text":"

Unit testing dapat digunakan untuk mengecek apakah kode yang dibuat bekerja sesuai dengan keinginan. Hal ini juga berguna ketika kamu melakukan perubahan kode. Dengan menggunakan tes, kamu bisa mengecek apakah perubahan yang dilakukan dapat menyebabkan perilaku yang tidak diinginkan pada aplikasi.

"},{"location":"tutorial/tutorial-1/#langkah-1-membuat-unit-test","title":"Langkah 1: Membuat Unit Test","text":"
  1. Bukalah berkas tests.py pada direktori aplikasi main.
  2. Isi tests.py dengan kode berikut.
from django.test import TestCase, Client\n\nclass mainTest(TestCase):\n    def test_main_url_is_exist(self):\n        response = Client().get('')\n        self.assertEqual(response.status_code, 200)\n\n    def test_main_using_main_template(self):\n        response = Client().get('')\n        self.assertTemplateUsed(response, 'main.html')\n

Penjelasan:

"},{"location":"tutorial/tutorial-1/#langkah-2-menjalankan-test","title":"Langkah 2: Menjalankan Test","text":"
  1. Jalankan tes dengan menggunakan perintah berikut.
python manage.py test\n
  1. Jika tes berhasil, akan mengeluarkan informasi berikut.
Found 2 test(s).\n Creating test database for alias 'default'...\n System check identified no issues (0 silenced).\n ..\n ----------------------------------------------------------------------\n Ran 2 tests in 0.006s\n\n OK\n Destroying test database for alias 'default'...\n

Selamat! Kamu telah berhasil menulis Django Test dan menjalankannya.

"},{"location":"tutorial/tutorial-1/#penutup","title":"Penutup","text":"
  1. Pada akhir tutorial ini, struktur direktori lokalmu akan terlihat seperti ini.

Huruf U menandakan bahwa terdapat berkas baru yang belum dilacak oleh Git. Huruf M menandakan bahwa terdapat berkas yang telah dilacak sebelumnya yang dimodifikasi.

  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.
  2. Jalankan perintah berikut untuk melakukan add, commit dan push.
git add .\ngit commit -m \"<pesan_commit>\"\ngit push origin <branch_utama>\n

"},{"location":"tutorial/tutorial-1/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-1/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-1/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023/2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-2/","title":"Tutorial 2: Form dan Data Delivery","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-2/#tujuan-pembelajaran","title":"Tujuan Pembelajaran\u200b","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-2/#pengenalan-data-delivery","title":"Pengenalan Data Delivery","text":"

Dalam mengembangkan suatu platform, ada kalanya kita perlu mengirimkan data dari satu stack ke stack lainnya. Data yang dikirimkan bisa bermacam-macam bentuknya. Beberapa contoh format data yang umum digunakan antara lain HTML, XML, dan JSON. Implementasi data delivery dalam bentuk HTML sudah kamu pelajari pada tutorial sebelumnya. Pada tutorial ini akan diajarkan terkait XML dan JSON.

"},{"location":"tutorial/tutorial-2/#xml-extensible-markup-language","title":"XML (Extensible Markup Language)","text":"

XML adalah singkatan dari eXtensible Markup Language. XML didesain menjadi self-descriptive, jadi dengan membaca XML tersebut kita bisa mengerti informasi apa yang ingin disampaikan dari data yang tertulis. XML digunakan pada banyak aplikasi web maupun mobile, yaitu untuk menyimpan dan mengirimkan data. XML hanya berisi informasi yang dibungkus di dalam tag. Kita perlu menulis program untuk mengirim, menerima, menyimpan, atau menampilkan informasi tersebut.

Contoh Format XML:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n    <name>Alice Johnson</name>\n    <age>25</age>\n    <address>\n        <street>123 Main St</street>\n        <city>Los Angeles</city>\n        <zip>90001</zip>\n    </address>\n</person>\n

XML di atas sangatlah self-descriptive:

Dokumen XML membentuk struktur seperti tree yang dimulai dari root, lalu branch, hingga berakhir pada leaves. Dokumen XML harus mengandung sebuah root element yang merupakan parent dari elemen lainnya. Pada contoh di atas, <person> adalah root element.

Baris <?xml version=\"1.0\" encoding=\"UTF-8\"?> biasanya disebut sebagai XML Prolog. XML Prolog bersifat opsional, akan tetapi jika ada maka posisinya harus berada di awal dokumen XML. Pada dokumen XML, semua elemen wajib memiliki closing tag. Tag pada XML sifatnya case sensitive, sehingga tag <person> dianggap berbeda dengan tag <Person>.

"},{"location":"tutorial/tutorial-2/#json-javascript-object-notation","title":"JSON (JavaScript Object Notation)","text":"

JSON adalah singkatan dari JavaScript Object Notation. JSON didesain menjadi self-describing, sehingga JSON sangat mudah untuk dimengerti. JSON digunakan pada banyak aplikasi web maupun mobile, yaitu untuk menyimpan dan mengirimkan data. Sintaks JSON merupakan turunan dari Object JavaScript. Akan tetapi format JSON berbentuk text, sehingga kode untuk membaca dan membuat JSON banyak terdapat dibanyak bahasa pemrograman.

Contoh format JSON:

{\n  \"name\": \"Alice Johnson\",\n  \"age\": 25,\n  \"address\": {\n    \"street\": \"123 Main St\",\n    \"city\": \"Los Angeles\",\n    \"zip\": \"90001\"\n  }\n}\n

Data pada JSON disimpan dalam bentuk key dan value. Pada contoh di atas yang menjadi key adalah name, age, dan address. Value dapat berupa tipe data primitif (string, number, boolean) ataupun berupa objek.

"},{"location":"tutorial/tutorial-2/#pre-tutorial-notes","title":"Pre-Tutorial Notes","text":"

Sebelum kamu memulai, serta untuk membantumu mengikuti tutorial 2 dengan baik, kami mengharapkan beberapa hasil berikut dari tutorial 1:

"},{"location":"tutorial/tutorial-2/#tutorial-implementasi-skeleton-sebagai-kerangka-views","title":"Tutorial: Implementasi Skeleton sebagai Kerangka Views","text":"

Sebelum kita membuat form registrasi, kita perlu membuat suatu skeleton yang berfungsi sebagai kerangka views dari situs web kita. Dengan kerangka views ini, kita dapat memastikan adanya konsistensi dalam desain situs web kita serta memperkecil kemungkinan terjadinya redundansi kode. Pada tutorial ini, kita akan membuat skeleton untuk situs web yang akan kita buat pada tutorial selanjutnya.

  1. Buat folder templates pada root folder (direktori utama) dan buatlah sebuah berkas HTML baru bernama base.html. Berkas base.html berfungsi sebagai template dasar yang dapat digunakan sebagai kerangka umum untuk halaman web lainnya di dalam proyek. Isilah berkas base.html tersebut dengan kode berikut:
{% load static %}\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    {% block meta %} {% endblock meta %}\n  </head>\n\n  <body>\n    {% block content %} {% endblock content %}\n  </body>\n</html>\n

Baris-baris yang dikurung dalam {% ... %} disebut dengan template tags Django. Baris-baris inilah yang akan berfungsi untuk memuat data secara dinamis dari Django ke HTML.

  1. Buka settings.py yang ada pada direktori proyek (book_tracker) dan carilah baris yang mengandung variabel TEMPLATES. Sesuaikan kode yang ada dengan potongan kode berikut agar berkas base.html terdeteksi sebagai berkas template.
...\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [BASE_DIR / 'templates'], # Tambahkan konten baris ini\n        'APP_DIRS': True,\n        ...\n    }\n]\n...\n
  1. Pada subdirektori templates yang ada pada direktori main (main/templates/), ubahlah kode berkas main.html yang telah dibuat di tutorial sebelumnya menjadi sebagai berikut.
{% extends 'base.html' %} {% block content %}\n<h1>Book Tracker Page</h1>\n\n<h5>Name:</h5>\n<p>{{name}}</p>\n\n<h5>Class:</h5>\n<p>{{class}}</p>\n{% endblock content %}\n

Perhatikan bahwa kode diatas merupakan kode yang sama dengan kode pada main.html pada tutorial sebelumnya. Perbedaannya adalah pada kode diatas, kita menggunakan base.html sebagai template utama.

"},{"location":"tutorial/tutorial-2/#tutorial-membuat-form-input-data-dan-menampilkan-data-buku-pada-html","title":"Tutorial: Membuat Form Input Data dan Menampilkan Data Buku Pada HTML","text":"

Sampai saat ini, belum ada data yang ditambahkan dan dimunculkan ke dalam aplikasi. Sekarang, kita akan membuat sebuah form sederhana untuk menginput data buku pada aplikasi sehingga nantinya kamu dapat menambahkan data baru untuk ditampilkan pada halaman utama.

  1. Buat berkas baru pada direktori main dengan nama forms.py untuk membuat struktur form yang dapat menerima data buku baru. Tambahkan kode berikut ke dalam berkas forms.py.
from django.forms import ModelForm\nfrom main.models import Book\n\nclass BookForm(ModelForm):\n    class Meta:\n        model = Book\n        fields = [\"name\", \"page\", \"description\"]\n

Penjelasan Kode:

from django.shortcuts import render, redirect   # Tambahkan import redirect di baris ini\nfrom main.forms import BookForm\nfrom main.models import Book\n
  1. Masih di berkas yang sama, buat fungsi baru dengan nama create_book yang menerima parameter request. Tambahkan potongan kode di bawah ini untuk menghasilkan formulir yang dapat menambahkan data buku secara otomatis ketika data di-submit dari form.
def create_book(request):\n    form = BookForm(request.POST or None)\n\n    if form.is_valid() and request.method == \"POST\":\n        form.save()\n        return redirect('main:show_main')\n\n    context = {'form': form}\n    return render(request, \"create_book.html\", context)\n

Penjelasan Kode:

def show_main(request):\n    books = Book.objects.all()\n\n    context = {\n        'name': 'Pak Bepe',\n        'class': 'PBP A',\n        'books': books\n    }\n\n    return render(request, \"main.html\", context)\n

Penjelasan Kode:

Fungsi Book.objects.all() digunakan untuk mengambil seluruh objek Book yang tersimpan pada database.

  1. Buka urls.py yang ada pada direktori main dan import fungsi create_book yang sudah kamu buat tadi.
from main.views import show_main, create_book\n
  1. Tambahkan path URL ke dalam variabel urlpatterns pada urls.py di main untuk mengakses fungsi yang sudah di-import pada poin sebelumnya.
urlpatterns = [\n   ...\n   path('create-book', create_book, name='create_book'),\n]\n
  1. Buat berkas HTML baru dengan nama create_book.html pada direktori main/templates. Isi create_book.html dengan kode berikut.
{% extends 'base.html' %} {% block content %}\n<h1>Add New Book</h1>\n\n<form method=\"POST\">\n  {% csrf_token %}\n  <table>\n    {{ form.as_table }}\n    <tr>\n      <td></td>\n      <td>\n        <input type=\"submit\" value=\"Add Book\" />\n      </td>\n    </tr>\n  </table>\n</form>\n\n{% endblock %}\n

Penjelasan Kode:

...\n<table>\n  <tr>\n    <th>Name</th>\n    <th>Page</th>\n    <th>Description</th>\n    <th>Date Added</th>\n  </tr>\n\n  {% comment %} Berikut cara memperlihatkan data produk di bawah baris ini\n  {%endcomment %} {% for book in books %}\n  <tr>\n    <td>{{book.name}}</td>\n    <td>{{book.page}}</td>\n    <td>{{book.description}}</td>\n    <td>{{book.date_added}}</td>\n  </tr>\n  {% endfor %}\n</table>\n\n<br />\n\n<a href=\"{% url 'main:create_book' %}\">\n  <button>Add New Book</button>\n</a>\n{% endblock content %}\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu. Coba tambahkan beberapa data produk baru dan seharusnya kamu dapat melihat data yang ditambahkan pada halaman utama aplikasi.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-dalam-bentuk-xml","title":"Tutorial Mengembalikan Data dalam Bentuk XML","text":"
  1. Buka views.py yang ada pada folder main dan tambahkan import HttpResponse dan Serializer pada bagian paling atas.
from django.http import HttpResponse\nfrom django.core import serializers\n
  1. Buatlah sebuah fungsi baru yang menerima parameter request dengan nama show_xml dan buatlah sebuah variabel di dalam fungsi tersebut yang menyimpan hasil query dari seluruh data yang ada pada Book.
def show_xml(request):\n    data = Book.objects.all()\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi XML dan parameter content_type=\"application/xml\".
def show_xml(request):\n    data = Book.objects.all()\n    return HttpResponse(serializers.serialize(\"xml\", data), content_type=\"application/xml\")\n

Penjelasan Kode:

serializers digunakan untuk translate objek model menjadi format lain seperti dalam fungsi ini adalah XML.

  1. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.
from main.views import show_main, create_book, show_xml\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('xml/', show_xml, name='show_xml'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/xml/ di browser favoritmu untuk melihat hasilnya.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-dalam-bentuk-json","title":"Tutorial: Mengembalikan Data dalam Bentuk JSON","text":"
  1. Buka views.py yang ada pada folder main dan buatlah sebuah fungsi baru yang menerima parameter request dengan nama show_json dengan sebuah variabel di dalamnya yang menyimpan hasil query dari seluruh data yang ada pada Book.
def show_json(request):\n    data = Book.objects.all()\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON dan parameter content_type=\"application/json\".
def show_json(request):\n    data = Book.objects.all()\n    return HttpResponse(serializers.serialize(\"json\", data), content_type=\"application/json\")\n
  1. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.
from main.views import show_main, create_book, show_xml, show_json\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('json/', show_json, name='show_json'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/json/ (sesuaikan dengan path url yang dibuat) di browser favoritmu untuk melihat hasilnya.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-berdasarkan-id-dalam-bentuk-xml-dan-json","title":"Tutorial: Mengembalikan Data Berdasarkan ID dalam Bentuk XML dan JSON","text":"
  1. Buka views.py yang ada pada folder main dan buatlah dua fungsi baru yang menerima parameter _request_ dan id dengan nama show_xml_by_id dan show_json_by_id.

  2. Buatlah sebuah variabel di dalam fungsi tersebut yang menyimpan hasil query dari data dengan id tertentu yang ada pada Book.

data = Book.objects.filter(pk=id)\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON atau XML dan parameter content_type dengan value \"application/xml\" (untuk format XML) atau \"application/json\" (untuk format JSON).

  2. XML

    def show_xml_by_id(request, id):\n    data = Book.objects.filter(pk=id)\n    return HttpResponse(serializers.serialize(\"xml\", data), content_type=\"application/xml\")\n
  3. JSON

    def show_json_by_id(request, id):\n    data = Book.objects.filter(pk=id)\n    return HttpResponse(serializers.serialize(\"json\", data), content_type=\"application/json\")\n
  4. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.

from main.views import show_main, create_book, show_xml, show_json, show_xml_by_id, show_json_by_id\n
  1. Tambahkan path URL ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('xml/<int:id>/', show_xml_by_id, name='show_xml_by_id'),\npath('json/<int:id>/', show_json_by_id, name='show_json_by_id'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/xml/[id]/ atau http://localhost:8000/json/[id]/ di browser favoritmu untuk melihat hasilnya.

Catatan: Sesuaikan [id] pada URL di atas dengan id objek yang ingin dilihat.

"},{"location":"tutorial/tutorial-2/#tutorial-penggunaan-postman-sebagai-data-viewer","title":"Tutorial: Penggunaan Postman Sebagai Data Viewer","text":"
  1. Pastikan server kamu sudah berjalan dengan perintah python manage.py runserver.

  2. Buka Postman dan buatlah sebuah request baru dengan method GET dan url http://localhost:8000/xml/ atau http://localhost:8000/json/ untuk mengetes apakah data terkirimkan dengan baik.

Panduan Instalasi Postman dapat dilihat pada Laman Resmi Postman.

Contoh:

  1. Klik tombol Send untuk mengirimkan request tersebut.

  2. Kamu akan melihat hasil response dari request tersebut pada bagian bawah Postman.

  1. Kamu juga dapat mengubah url menjadi http://localhost:8000/xml/[id] atau http://localhost:8000/json/[id] untuk mengetes fungsi pengambilan data produk berdasarkan ID.

"},{"location":"tutorial/tutorial-2/#penutup","title":"Penutup","text":"
  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.
  1. Pada akhir tutorial ini, struktur direktori lokalmu akan terlihat seperti ini.
  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjutnya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  2. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-2/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-2/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-2/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-3/","title":"Tutorial 3: Autentikasi, Session, dan Cookies","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-3/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, kamu diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-3/#pengenalan-http","title":"Pengenalan HTTP","text":"

HTTP (HyperText Transfer Protocol) adalah protokol yang digunakan untuk berkomunikasi antara client dan server. HTTP bersifat stateless yang berarti setiap transaksi/aktivitas yang dilakukan dianggap sebagai transaksi/aktivitas yang benar-benar baru, sehingga tidak ada data sebelumnya yang disimpan untuk transaksi/aktivitas saat ini.

Beberapa konsep dasar mengenai HTTP:

  1. Client/Server: Interaksi dilakukan antar client/server. Klien adalah pihak yang melakukan request dan server adalah pihak yang memberikan response.

  2. Stateless: Setiap aktivitas (request/response) bersifat independen, tidak tersimpan pada aktivitas terdahulu.

  3. OSI Layer/Model: Model Open Systems Interconnection (OSI) menjelaskan 7 lapisan yang digunakan sistem komputer untuk berkomunikasi melalui jaringan. Model 7-layer OSI terdiri dari Application Layer, Presentation Layer, Session Layer, Transport Layer, Network Layer, Data Link Layer, dan Physical Layer.

  4. Application Layer: Pada OSI Model yang disinggung di atas, website berjalan pada application layer. Sedangkan, proses request/response terjadi pada transport Layer yang umumnya menggunakan protokol TCP yang menentukan bagaimana data akan dikirim. Application Layer tidak peduli apa yang dilakukan oleh transport Layer (bagaimana data dikirim, diolah, dsb) karena application layer hanya berfokus kepada request dan response.

Lapisan OSI lainnya akan diajarkan pada mata kuliah Jaringan Komputer/Jaringan Komunikasi Data. Kamu dapat mencarinya sendiri jika kamu penasaran. \ud83d\ude09

  1. Client Actions Method: Terdapat metode-metode yang digunakan oleh client saat melakukan request. Contoh: GET, POST, PUT, DELETE, dll. Penjelasan lebih detail dapat dibaca di sini.

  2. Server Status Code: Merupakan status kode yang diberikan oleh server terhadap suatu request pada sebuah halaman web. Contoh: 200 (OK), 404 (Page Not Found), 500 (Internal Server Error), dsb. Penjelasan lebih detail dapat dibaca di sini.

  3. Headers: Merupakan informasi kecil yang dikirim bersamaan dengan request dan response. Informasi-informasi tersebut berguna sebagai data tambahan yang digunakan untuk memproses request/response. Contoh: Pada headers, terdapat content-type:json. Artinya, tipe konten yang diminta/dikirim adalah json. Headers juga menyimpan data cookies.

"},{"location":"tutorial/tutorial-3/#pengenalan-cookies-session","title":"Pengenalan Cookies & Session","text":"

Semua komunikasi antara klien dan server dilakukan melalui protokol HTTP, di mana HTTP merupakan stateless protocol. Artinya state yang satu dengan yang lain tidak berhubungan (independen). Hal ini mengharuskan komputer klien yang menjalankan browser untuk membuat koneksi TCP ke server setiap kali melakukan request.

Tanpa adanya koneksi persisten antara klien dan server, software pada setiap sisi (endpoint) tidak dapat bergantung hanya pada koneksi TCP untuk melakukan holding state atau holding session state.

"},{"location":"tutorial/tutorial-3/#apa-yang-dimaksud-dengan-holding-state","title":"Apa yang dimaksud dengan holding state?","text":"

Sebagai contoh, kamu ingin mengakses suatu halaman A pada suatu web yang mensyaratkan pengaksesnya sudah login ke dalam web. Kemudian kamu login ke web tersebut dan berhasil membuka halaman A. Saat ingin pindah ke halaman B pada web yang sama, tanpa adanya suatu proses holding state maka kamu akan diminta untuk login kembali. Begitu yang akan terjadi setiap kali kamu mengakses halaman yang berbeda padahal masih pada web yang sama.

Proses memberitahu \"siapa\" yang sedang login dan menyimpan data ini dikenal sebagai bentuk dialog antara klien-server dan merupakan dasar session - a semi-permanent exchange of information. Merupakan hal yang sulit untuk membuat HTTP melakukan holding state (karena HTTP merupakan stateless protocol). Oleh karena itu, dibutuhkan teknik untuk mengatasi masalah tersebut, yaitu Cookie dan Session.

"},{"location":"tutorial/tutorial-3/#cara-melakukan-holding-state","title":"Cara melakukan holding state?","text":"

Salah satu cara yang paling banyak digunakan untuk melakukan holding state adalah dengan menggunakan session ID yang disimpan sebagai cookie pada komputer klien. Session ID dapat dianggap sebagai suatu token (barisan karakter) untuk mengenali session yang unik pada aplikasi web tertentu. Daripada menyimpan semua jenis informasi sebagai cookies pada klien seperti username, nama, dan password, hanya Session ID yang disimpan.

Session ID ini kemudian dapat dipetakan ke suatu struktur data pada sisi web server. Pada struktur data tersebut, kamu dapat menyimpan semua informasi yang kamu butuhkan. Pendekatan ini jauh lebih aman untuk menyimpan informasi mengenai pengguna, daripada menyimpannya pada cookie. Dengan cara ini, informasi tidak dapat disalahgunakan oleh klien atau koneksi yang mencurigakan.

Selain itu, pendekatan ini lebih \"tepat\" jika data yang akan disimpan ada banyak. Hal itu karena cookie hanya dapat menyimpan maksimal 4 KB data. Bayangkan kamu sudah login ke suatu web/aplikasi dan mendapat session ID (session identifier). Untuk dapat melakukan holding state pada HTTP yang stateless, browser biasanya mengirimkan suatu session ID ke server pada setiap request. Dengan begitu, setiap kali datang suatu request, maka server akan bereaksi (kurang lebih) \"Oh, ini orang yang tepat!\". Kemudian server akan mencari informasi state di memori server atau di database berdasarkan session ID yang didapat, lalu mengembalikan data yang diminta.

Perbedaan penting yang perlu diingat adalah data cookie disimpan pada sisi klien, sedangkan data session biasanya disimpan pada sisi server. Untuk pembahasan lebih detail mengenai stateless, stateful, cookie, dan session dapat dibaca di sini.

Berikut tabel singkat yang menjelaskan perbedaan antara cookies, session, dan local storage secara singkat.

Cookies Local Storage Sessions Kapasitas 4 KB 5 MB 5 MB Teknologi Browser HTML4/HTML5 HTML5 HTML5 Aksesibilitas Semua window Semua window Tab yang sama Kedaluwarsa Diatur manual Selamanya Saat tab ditutup

Beberapa tautan video yang dapat memperkaya pengetahuan terkait materi ini:

"},{"location":"tutorial/tutorial-3/#pre-tutorial-notes","title":"Pre-Tutorial Notes","text":"

Sebelum kamu memulai, serta untuk membantumu mengikuti tutorial 3 dengan baik, kami mengharapkan beberapa hasil berikut dari tutorial 2:

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-dan-form-registrasi","title":"Tutorial: Membuat Fungsi dan Form Registrasi","text":"

Pada tutorial sebelumnya, kita sudah mencoba membuat sebuah form untuk menambahkan suatu buku. Bagaimana? Mudah kan? Pada tutorial ini kita akan membuat halaman utama (main) menjadi restricted dengan cara membuat akun untuk pengguna. Sehingga, pengguna yang ingin mengakses halaman utama main harus melakukan login terlebih dahulu agar mendapatkan akses.

  1. Aktifkan virtual environment terlebih dahulu pada terminal. (Hint: Ingat tutorial 0!)

  2. Buka views.py yang ada pada subdirektori main pada proyek kamu. Tambahkan import redirect, UserCreationForm, dan messages pada bagian paling atas.

from django.shortcuts import redirect\nfrom django.contrib.auth.forms import UserCreationForm\nfrom django.contrib import messages\n

Penjelasan Kode:

UserCreationForm adalah impor formulir bawaan yang memudahkan pembuatan formulir pendaftaran pengguna dalam aplikasi web. Dengan formulir ini, pengguna baru dapat mendaftar dengan mudah di situs web Anda tanpa harus menulis kode dari awal.

  1. Tambahkan fungsi register di bawah ini ke dalam views.py. Fungsi ini berfungsi untuk menghasilkan formulir registrasi secara otomatis dan menghasilkan akun pengguna ketika data di-submit dari form.
def register(request):\n    form = UserCreationForm()\n\n    if request.method == \"POST\":\n        form = UserCreationForm(request.POST)\n        if form.is_valid():\n            form.save()\n            messages.success(request, 'Your account has been successfully created!')\n            return redirect('main:login')\n    context = {'form':form}\n    return render(request, 'register.html', context)\n

Penjelasan Kode:

{% extends 'base.html' %} \n\n{% block meta %}\n<title>Register</title>\n{% endblock meta %} \n\n{% block content %}\n\n<div class=\"login\">\n  <h1>Register</h1>\n\n  <form method=\"POST\">\n    {% csrf_token %}\n    <table>\n      {{ form.as_table }}\n      <tr>\n        <td></td>\n        <td><input type=\"submit\" name=\"submit\" value=\"Daftar\" /></td>\n      </tr>\n    </table>\n  </form>\n\n  {% if messages %}\n  <ul>\n    {% for message in messages %}\n    <li>{{ message }}</li>\n    {% endfor %}\n  </ul>\n  {% endif %}\n</div>\n\n{% endblock content %}\n
  1. Buka urls.py yang ada pada subdirektori main dan impor fungsi yang sudah kamu buat tadi.
from main.views import register\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
 urlpatterns = [\n     ...\n     path('register/', register, name='register'),\n ]\n

Kita sudah menambahkan formulir registrasi akun dan membuat mekanisme register. Selanjutnya, kita akan membuat form login agar pengguna dapat melakukan autentikasi akun.

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-login","title":"Tutorial: Membuat Fungsi Login","text":"
  1. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import authenticate dan login pada bagian paling atas.
from django.contrib.auth import authenticate, login\n

Penjelasan Kode:

Singkatnya, fungsi authenticate dan login yang diimport diatas adalah fungsi bawaan Django yang dapat digunakan untuk melakukan autentikasi dan login (jika autentikasi berhasil). Selengkapnya dapat dibaca di sini.

  1. Tambahkan fungsi login_user di bawah ini ke dalam views.py. Fungsi ini berfungsi untuk mengautentikasi pengguna yang ingin login.
def login_user(request):\n    if request.method == 'POST':\n        username = request.POST.get('username')\n        password = request.POST.get('password')\n        user = authenticate(request, username=username, password=password)\n        if user is not None:\n            login(request, user)\n            return redirect('main:show_main')\n        else:\n            messages.info(request, 'Sorry, incorrect username or password. Please try again.')\n    context = {}\n    return render(request, 'login.html', context)\n

Penjelasan Kode:

authenticate(request, username=username, password=password) digunakan untuk melakukan autentikasi pengguna berdasarkan username dan password yang diterima dari permintaan (request) yang dikirim oleh pengguna saat login.

  1. Buatlah berkas HTML baru dengan nama login.html pada direktori main/templates. Isi dari login.html dapat kamu isi dengan template berikut.
{% extends 'base.html' %}\n\n{% block meta %}\n<title>Login</title>\n{% endblock meta %} \n\n{% block content %}\n<div class=\"login\">\n  <h1>Login</h1>\n\n  <form method=\"POST\" action=\"\">\n    {% csrf_token %}\n    <table>\n      <tr>\n        <td>Username:</td>\n        <td>\n          <input\n            type=\"text\"\n            name=\"username\"\n            placeholder=\"Username\"\n            class=\"form-control\"\n          />\n        </td>\n      </tr>\n\n      <tr>\n        <td>Password:</td>\n        <td>\n          <input\n            type=\"password\"\n            name=\"password\"\n            placeholder=\"Password\"\n            class=\"form-control\"\n          />\n        </td>\n      </tr>\n\n      <tr>\n        <td></td>\n        <td><input class=\"btn login_btn\" type=\"submit\" value=\"Login\" /></td>\n      </tr>\n    </table>\n  </form>\n\n  {% if messages %}\n  <ul>\n    {% for message in messages %}\n    <li>{{ message }}</li>\n    {% endfor %}\n  </ul>\n  {% endif %} Don't have an account yet?\n  <a href=\"{% url 'main:register' %}\">Register Now</a>\n</div>\n\n{% endblock content %}\n
  1. Buka urls.py yang ada pada subdirektori main dan import fungsi yang sudah kamu buat tadi.
from main.views import login_user\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
urlpatterns = [\n   ...\n   path('login/', login_user, name='login'),\n]\n

Kita sudah menambahkan form login akun dan membuat mekanisme login. Selanjutnya, kita akan membuat mekanisme logout dan menambahkan tombol logout pada halaman main.

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-logout","title":"Tutorial: Membuat Fungsi Logout","text":"
  1. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import logout ini pada bagian paling atas.
from django.contrib.auth import logout\n
  1. Tambahkan fungsi di bawah ini ke dalam fungsi views.py. Fungsi ini berfungsi untuk melakukan mekanisme logout.
def logout_user(request):\n    logout(request)\n    return redirect('main:login')\n

Penjelasan Kode:

...\n<a href=\"{% url 'main:logout' %}\">\n  <button>Logout</button>\n</a>\n...\n
  1. Buka urls.py yang ada pada subdirektori main dan import fungsi yang sudah kamu buat tadi.
from main.views import logout_user\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
urlpatterns = [\n   ...\n   path('logout/', logout_user, name='logout'),\n]\n

Kita sudah membuat mekanisme logout dan menyelesaikan sistem autentikasi dalam proyek ini.

"},{"location":"tutorial/tutorial-3/#tutorial-merestriksi-akses-halaman-main","title":"Tutorial: Merestriksi Akses Halaman Main","text":"
  1. Buka kembali views.py yang ada pada subdirektori main dan tambahkan import login_required pada bagian paling atas.
from django.contrib.auth.decorators import login_required\n

Penjelasan Kode: Kode from django.contrib.auth.decorators import login_required digunakan untuk mengimpor sebuah decorator yang bisa mengharuskan pengguna masuk (login) terlebih dahulu sebelum dapat mengakses suatu halaman web.

  1. Tambahkan potongan kode @login_required(login_url='/login') di atas fungsi show_main agar halaman main hanya dapat diakses oleh pengguna yang sudah login (terautentikasi).
...\n@login_required(login_url='/login')\ndef show_main(request):\n...\n

Setelah melakukan restriksi akses halaman main, jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu untuk melihat hasilnya. Seharusnya halaman yang muncul bukanlah daftar buku di halaman main, tetapi akan di-redirect ke halaman login.

"},{"location":"tutorial/tutorial-3/#tutorial-menggunakan-data-dari-cookies","title":"Tutorial: Menggunakan Data Dari Cookies","text":"

Sekarang, kita akan melihat penggunaan cookies dengan menambahkan data last login dan menampilkannya ke halaman main.

  1. Lakukan logout terlebih dahulu apabila kamu sedang menjalankan aplikasi Django-mu.

  2. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import HttpResponseRedirect, reverse, dan datetime pada bagian paling atas.

import datetime\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\n
  1. Pada fungsi login_user, kita akan menambahkan fungsionalitas menambahkan cookie yang bernama last_login untuk melihat kapan terakhir kali pengguna melakukan login. Caranya adalah dengan mengganti kode yang ada pada blok if user is not None menjadi potongan kode berikut.
...\nif user is not None:\n    login(request, user)\n    response = HttpResponseRedirect(reverse(\"main:show_main\"))\n    response.set_cookie('last_login', str(datetime.datetime.now()))\n    return response\n...\n

Penjelasan Kode:

Perhatikan indentasi kode kamu, pastikan tidak terdapat dead code pada fungsi tersebut.

  1. Pada fungsi show_main, tambahkan potongan kode 'last_login': request.COOKIES['last_login'] ke dalam variabel context. Berikut adalah contoh kode yang sudah diubah.
context = {\n    'name': 'Pak Bepe',\n    'class': 'PBP A',\n    'books': books,\n    'last_login': request.COOKIES['last_login'],\n}\n

Penjelasan Kode:

'last_login': request.COOKIES['last_login'] berfungsi menambahkan informasi cookie last_login pada response yang akan ditampilkan di halaman web.

  1. Ubah fungsi logout_user menjadi seperti potongan kode berikut.
def logout_user(request):\n    logout(request)\n    response = HttpResponseRedirect(reverse('main:login'))\n    response.delete_cookie('last_login')\n    return response\n

Penjelasan Kode:

response.delete_cookie('last_login') berfungsi untuk menghapus cookie last_login saat pengguna melakukan logout.

  1. Buka berkas main.html dan tambahkan potongan kode berikut di setelah tombol logout untuk menampilkan data last login.
...\n<h5>Sesi terakhir login: {{ last_login }}</h5>\n...\n
  1. Silakan refresh halaman login (atau jalankan proyek Django-mu dengan perintah python manage.py runserver jika kamu belum menjalankan proyekmu) dan cobalah untuk login. Data last login kamu akan muncul di halaman main.

  2. Jika kamu menggunakan browser Google Chrome, untuk melihat data cookie last_login, kamu dapat mengakses fitur inspect element dan membuka bagian Application/Storage. Klik bagian Cookies dan kamu dapat melihat data cookies yang tersedia. Selain last_login, kamu juga dapat melihat data sessionid dan csrftoken. Berikut adalah contoh tampilannya.

  1. Jika kamu melakukan logout dan membuka bagian riwayat cookie, cookie yang dibuat sebelumnya akan hilang dan dibuat ulang ketika kamu login kembali.

Sebelum melanjutkan ke tutorial berikutnya, cobalah untuk membuat satu akun pada halaman web kamu.

"},{"location":"tutorial/tutorial-3/#tutorial-menghubungkan-model-book-dengan-user","title":"Tutorial: Menghubungkan Model Book dengan User","text":"

Kamu perlu mengikuti tutorial secara berurut dari awal sebelum menjalankan bagian berikut. Jika kamu tidak mengikuti tutorial secara berurut, maka kami tidak bertanggung jawab atas error di luar pembahasan tutorial yang dapat muncul dari bagian tutorial berikut.

Terakhir, kita akan menghubungkan setiap objek Book yang akan dibuat dengan pengguna yang membuatnya, sehingga pengguna yang sedang terotorisasi hanya melihat buku-buku yang telah dibuat sendiri. Untuk itu, ikuti langkah-langkah berikut:

  1. Buka models.py yang ada pada subdirektori main dan tambahkan kode berikut pada dibawah baris kode untuk mengimpor model:
...\nfrom django.contrib.auth.models import User\n...\n
  1. Pada model Book yang sudah dibuat, tambahkan potongan kode berikut:
class Book(models.Model):\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    ...\n

Penjelasan Kode:

Potongan kode diatas berfungsi untuk menghubungkan satu buku dengan satu user melalui sebuah relationship, dimana sebuah buku pasti terasosiasikan dengan seorang user. Lebih lanjutnya terkait ForeignKey akan dipelajari pada mata kuliah Basis Data. Penjelasan lebih lanjut terkait ForeignKey pada Django dapat dilihat di sini.

  1. Buka kembali views.py yang ada pada subdirektori main, dan ubah potongan kode pada fungsi create_book menjadi sebagai berikut:
def create_book(request):\n form = BookForm(request.POST or None)\n\n if form.is_valid() and request.method == \"POST\":\n     book = form.save(commit=False)\n     book.user = request.user\n     book.save()\n     return redirect('main:show_main')\n\n context = {'form': form}\n return render(request, \"create_book.html\", context)\n ...\n

Penjelasan Kode:

Parameter commit=False yang digunakan pada potongan kode diatas berguna untuk mencegah Django agar tidak langsung menyimpan objek yang telah dibuat dari form langsung ke database. Hal tersebut memungkinkan kita untuk memodifikasi terlebih dahulu objek tersebut sebelum disimpan ke database. Pada kasus ini, kita akan mengisi field user dengan objek User dari return value request.user yang sedang terotorisasi untuk menandakan bahwa objek tersebut dimiliki oleh pengguna yang sedang login.

  1. Ubah fungsi show_main menjadi sebagai berikut.
def show_main(request):\n    books = Book.objects.filter(user=request.user)\n\n    context = {\n         'name': request.user.username,\n         ...\n    }\n...\n

Penjelasan Kode:

  1. Ketik angka 1 lagi untuk menetapkan user dengan ID 1 (yang sudah kita buat sebelumnya) pada model yang sudah ada.

  1. Lakukan python manage.py migrate untuk mengaplikasikan migrasi yang dilakukan pada poin sebelumnya.

Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu untuk melihat hasilnya. Cobalah untuk membuat akun baru dan login dengan akun yang baru dibuat. Amatilah halaman utama, buku yang tadi telah dibuat dengan akun sebelumnya tidak akan ditampilkan di halaman pengguna akun yang baru saja kamu buat. Hal tersebut berarti kamu sudah berhasil menghubungkan objek Book dengan User yang membuatnya.

"},{"location":"tutorial/tutorial-3/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu telah menyelesaikan Tutorial 3 dengan baik. \ud83d\ude04

Setelah kamu menyelesaikan seluruh tutorial di atas, harapannya kamu sekarang lebih paham tentang penggunaan form, autentikasi, session, dan cookie pada framework Django.

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  1. Pada akhir tutorial ini, struktur subdirektori main pada lokalmu terlihat seperti ini.

  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  2. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-3/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-3/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023/2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-4/","title":"Tutorial 4: Desain Web Menggunakan HTML dan CSS3 & Metode Update dan Delete pada Data","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-4/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-4/#pengenalan-html","title":"Pengenalan HTML","text":"

HyperText Markup Language (HTML) adalah bahasa markup standar untuk dokumen agar dapat ditampilkan dalam browser web. HTML mendefinisikan struktur dari konten suatu website.

Silakan pelajari dan mencoba sendiri HTML pada referensi ini.

Perbedaan antara HTML dan HTML5 bisa kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#pengenalan-css","title":"Pengenalan CSS","text":""},{"location":"tutorial/tutorial-4/#apa-itu-css","title":"Apa itu CSS?","text":"

Cascading Style Sheets (CSS) adalah bahasa yang digunakan untuk mendeskripsikan tampilan dan format dari sebuah situs web yang ditulis pada markup language (seperti HTML). CSS berguna untuk membuat tampilan situs web menjadi lebih menarik.

Untuk mempelajari perbedaan antara CSS dan CSS3 bisa kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#cara-penulisan-css","title":"Cara Penulisan CSS","text":"

Secara umum, CSS dapat dituliskan dalam bentuk sebagai berikut.

selector {\n  properties: value;\n}\n

Silakan pelajari dan mencoba sendiri CSS pada referensi ini.

Terdapat tiga jenis cara penulisan CSS:

  1. Inline Styles
  2. Internal Style Sheet
  3. External Style Sheet

Silakan pelajari tentang ketiga jenis CSS tersebut pada referensi ini.

Perlu diperhatikan, jika kamu membuat jenis External Style Sheet, kamu perlu menambahkan tag {% load staticfiles %} pada halaman HTML kamu. Contohnya seperti potongan kode di bawah ini.

{% load staticfiles %}\n<html>\n  <head>\n    <title>Tutorial CSS Yay</title>\n    <link rel=\"stylesheet\" href=\"{% static 'css/tutorial.css' %}\" />\n  </head>\n  <body>\n    <div>\n      <h1>Tutorial CSS Yay</h1>\n    </div>\n    <div id=\"main\">\n      <div>\n        <p>published: 27 September 2023</p>\n        <h1><a href=\"\">Tutorial CSS ku</a></h1>\n        <p>Yay ini tutorial yang gampang!</p>\n      </div>\n    </div>\n  </body>\n</html>\n

Hal ini dapat terjadi karena CSS merupakan static files di Django. Static files akan dijelaskan pada bagian selanjutnya.

"},{"location":"tutorial/tutorial-4/#catatan-tambahan","title":"Catatan Tambahan","text":"

Jika terdapat lebih dari satu style yang didefinisikan untuk suatu elemen, maka style yang akan diterapkan adalah yang memiliki prioritas yang lebih tinggi. Berikut ini urutan prioritasnya, nomor 1 yang memiliki prioritas paling tinggi.

  1. Inline style
  2. External dan internal style sheets
  3. Browser default
"},{"location":"tutorial/tutorial-4/#static-files-pada-django","title":"Static files pada Django","text":"

Pada framework Django, terdapat file-file yang disebut dengan static files. Static files merupakan file-file pendukung HTML pada suatu situs web. Contoh static files adalah CSS, JavaScript, dan gambar.

Pengaturan untuk static files terletak pada file settings.py:

...\n# Static files (CSS, JavaScript, Images)\n# httpsdocs.djangoproject.comen1.9howtostatic-files\nSTATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')\nSTATIC_URL = 'static'\n...\n
Pada settings.py, terdapat:

Perintah collectstatic adalah perintah untuk mengumpulkan static files dari semua app sehingga mempermudah akses untuk semua app.

Penjelasan lebih lengkap mengenai static files dapat kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#selector-pada-css","title":"Selector pada CSS","text":"

Pada tutorial ini, kita akan mengenak tiga jenis selector: Element Selector, ID Selector, dan Class Selector.

  1. ELement Selector

    Element Selector memungkinkan kita mengubah properti untuk semua elemen yang memiliki tag HTML yang sama.

    Contoh penggunaan Element Selector:

    <body>\n  <div>\n    <h1>Tutorial CSS Yay :D</h1>\n    <h2>Tutorial CSS Yay kedua :D</h2>\n  </div>\n  ...\n</body>\n

    Kita dapat menggunakan element sebagai selector dalam file CSS. Element selector menggunakan format [id_name] (tanpa diawali oleh sebuah simbol)

    h1 {\n  color: #fca205;\n  font-family: \"Monospace\";\n  font-style: italic;\n}\n
    2. ID Selector

    ID selector menggunakan ID pada tag sebagai selector-nya. ID bersifat unik dalam satu halaman web. ID dapat ditambahkan pada halaman template HTML.

    Contoh penggunaan ID Selector pada template HTML:

    <body>\n  <div id=\"header\">\n    <h1>Tutorial CSS Yay :D</h1>\n  </div>\n  ...\n</body>\n

    Kemudian, kita dapat menggunakan ID tersebut sebagai selector dalam file CSS. ID selector menggunakan format #[id_name] (selalu diawali #)

    #header {\n  background-color: #f0f0f0;\n  margin-top: 0;\n  padding: 20px 20px 20px 40px;\n}\n

  2. Class Selector

    Class Selector memungkinkan kita untuk mengelompokkan elemen dengan karakteristik yang sama.

    Contoh penggunaan Class Selector pada template HTML:

    ...\n<div id=\"main\">\n    <div class=\"content_section\">\n        <p class=\"date\">published: 28 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS ku</a></h2>\n        <p id=\"content_1\">Yay ini tutorial yang gampang!</p>\n    </div>\n    <div class=\"content_section\">\n        <p class=\"date \">published: 29 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS mu</a></h2>\n        <p id=\"content_2\">Yay ini tutorial yang mudah!</p>\n    </div>\n    <div class=\"content_section\">\n        <p>published: 30 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS semua</a></h2>\n        <p id=\"content_3\">Yay ini tutorial yang tidak sulit!</p>\n    </div>\n</div>\n...\n

    Kemudian, kita dapat menggunakan Class tersebut sebagai selector dalam file CSS. Class selector menggunakan format .[class_name] (diawali .)

    .content_section {\n  background-color: #3696e1;\n  margin-bottom: 30px;\n  color: #000000;\n  font-family: cursive;\n  padding: 20px 20px 20px 40px;\n}\n

Untuk memperdalam pengetahuan mengenai CSS Selector Reference, kamu dapat membaca referensi ini.

"},{"location":"tutorial/tutorial-4/#tips-trik-css","title":"Tips & trik CSS","text":""},{"location":"tutorial/tutorial-4/#mengenal-combinator-pada-css","title":"Mengenal Combinator pada CSS","text":"

Combinator dalam CSS menghubungkan dua atau lebih selector untuk merincikan lebih lanjut elemen-elemen yang di-select.

Terdapat empat combinators pada CSS. Berikut ringkasan pemakaiannya:

Combinator Contoh pemakaian Penjelasan contoh Descendant selector (space) div p Menyeleksi semua elemen p yang merupakan keturunan dari elemen div Child selector (>) div > p Menyeleksi semua elemen p yang merupakan anak dari elemen div Adjacent sibling selector (+) div + p Menyeleksi elemen p pertama yang berada tepat setelah elemen div (harus memiliki elemen induk yang sama) General sibling selector (~) div ~ p Menyeleksi semua elemen p yang sejajar dan berada setelah elemen div

Silakan pelajari lebih lanjut mengenai combinator melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#mengenal-pseudo-class-pada-css","title":"Mengenal Pseudo-class pada CSS","text":"

Pseudo-class digunakan untuk mendefinisikan state khusus dari suatu elemen. Sintaks pemakaian pseudo-class adalah sebagai berikut:

selector:pseudo-class {\n  property: value;\n}\n

Beberapa contoh pseudo-class: | Pseudo-class | Mengaplikasikan style pada .. | | -------- | -------- | | :link | tautan yang belum pernah dikunjungi | | :visited | tautan yang sudah pernah dikunjungi | | :hover | saat pengguna mengarahkan kursor di atas elemen tersebut | | :active | saat elemen diaktifkan (biasanya saat pengguna mengklik elemen tersebut) | | :focus | saat elemen fokus (seperti saat pengguna mengklik input field) | | :checked | elemen yang telah dicentang | | :disabled | elemen yang telah dibuat tidak responsif (misalnya tombol yang tidak bisa diklik) |

Silakan pelajari lebih lanjut mengenai pseudo-class melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#mengenal-box-model-pada-css","title":"Mengenal Box Model pada CSS","text":"

Box model pada CSS pada dasarnya merupakan suatu box yang membungkus setiap elemen HTML dan terdiri atas:

Silakan pelajari lebih lanjut mengenai margin, border, dan padding melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#pengenalan-bootstrap-tailwind","title":"Pengenalan Bootstrap & Tailwind","text":"

Pada bidang pengembangan web, terdapat banyak framework CSS yang sering digunakkan. Fungsi sebuah framework adalah untuk mempermudah pekerjaan programmer pada saat mengerjakan pekerjaan mereka. Framework CSS yang populer saat ini adalah Bootstrap dan juga Tailwind. Kedua framework ini memberikan banyak kelebihan dibandingkan CSS yang biasa kita gunakan. Berikut adalah kelebihan-kelebihan penggunaan framework yang diperoleh dibandingkan CSS biasa:

  1. Proses Pengembangan Lebih Cepat: Framework seperti Bootstrap menyediakan komponen siap pakai sehingga tanpa harus menulis kode CSS dari awal.
  2. Responsif secara Bawaan: Framework seperti Bootstrap dan Tailwind telah dirancang dengan responsif.
  3. Skalabilitas Besar: Framework CSS memberikan struktur yang baik untuk proyek yang berkembang seiring waktu.

Bootstrap dan Tailwind tentu saja sebagai framework memiliki perbedaan yang signifikan antara satu sama lain, yaitu:

Tailwind Bootstrap Tailwind CSS membangun tampilan dengan menggabungkan kelas-kelas utilitas yang telah didefinisikan sebelumnya. Bootstrap menggunakan gaya dan komponen yang telah didefinisikan, yang memiliki tampilan yang sudah jadi dan dapat digunakan secara langsung. Tailwind CSS memiliki file CSS yang lebih kecil sedikit dibandingkan Bootstrap dan hanya akan memuat kelas-kelas utilitas yang ada Bootstrap memiliki file CSS yang lebih besar dibandingkan dengan Tailwind CSS karena termasuk banyak komponen yang telah didefinisikan. Tailwind CSS memiliki memberikan fleksibilitas dan adaptabilitas tinggi terhadap proyek Bootstrap sering kali menghasilkan tampilan yang lebih konsisten di seluruh proyek karena menggunakan komponen yang telah didefinisikan. Tailwind CSS memiliki pembelajaran yang lebih curam karena memerlukan pemahaman terhadap kelas-kelas utilitas yang tersedia dan bagaimana menggabungkannya untuk mencapai tampilan yang diinginkan. Bootstrap memiliki pembelajaran yang lebih cepat untuk pemula karena dapat mulai dengan komponen yang telah didefinisikan."},{"location":"tutorial/tutorial-4/#responsive-web-design","title":"Responsive Web Design","text":"

Responsive web design merupakan metode sistem desain web yang memiliki tujuan untuk menghasilkan tampilan web yang terlihat baik pada seluruh perangkat seperti desktop, tablet, mobile, dan sebagainya. Responsive web design tidak mengubah isi dari situs web, tetapi hanya mengubah tampilan dan penataan pada setiap perangkat agar sesuai dengan lebar layar dan kemampuan perangkat tersebut. Dalam responsive web design tampilan-tampilan tertentu membutuhkan bantuan CSS (seperti mengecilkan atau membesarkan) suatu elemen.

Salah satu cara untuk menguji apakah suatu situs web menggunakan responsive web design adalah dengan mengakses situs web tersebut dan mengaktifkan fitur Toggle Device Mode pada browser. Fitur ini memungkinkan kamu untuk melihat bagaimana situs web tersebut ditampilkan pada berbagai perangkat, seperti komputer, tablet, atau smartphone, tanpa harus mengubah ukuran jendela browser.

Berikut adalah cara untuk mengakses fitur tersebut pada browser Google Chrome. * Windows/Linux : CTRL + SHIFT + M * Mac : Command + Shift + M

Cara lain yang lebih praktis adalah dengan melakukan klik kanan pada browser dan memilih Inspect Element/Inspect untuk membuka Dev Tools yang berguna.

Untuk mempelajari lebih lengkap mengenai Reponsive Web Design, kamu dapat membuka referensi ini.

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-bootstrap-ke-aplikasi","title":"Tutorial: Menambahkan Bootstrap ke Aplikasi","text":"

Pada mata kuliah PBP ini, kita akan memfokuskan pembelajaran CSS menggunakan framework bootstrap. Berikut adalah langkah yang perlu kamu lakukan untuk menyelesaikan bagian tutorial ini.

  1. Buka project django kalian (book_tracker), lalu buka file base.html yang telah dibuat sebelumnya pada templates folder yang berada di root project kalian.

  2. Didalam templates/base.html, tambahkan tag agar halaman web kamu dapat menyesuaikan ukuran dan perilaku perangkat mobile (apabila belum).

    <head>\n    {% block meta %}\n        <meta charset=\"UTF-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {% endblock meta %}\n</head>\n
  3. Tambahkan Bootstrap CSS dan juga JS.

    CSS:

    <head>\n    {% block meta %}\n        ...\n    {% endblock meta %}\n    <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN\" crossorigin=\"anonymous\">\n</head>\n

    JS:

    <head>\n    ...\n    <script src=\"https://code.jquery.com/jquery-3.6.0.min.js\" integrity=\"sha384-KyZXEAg3QhqLMpG8r+J4jsl5c9zdLKaUk5Ae5f5b1bw6AUn5f5v8FZJoMxm6f5cH1\" crossorigin=\"anonymous\"></script>\n</head>\n

  4. (Opsional) Apabila kalian ingin menggunakan dropdowns, popover, tooltips yang disediakan framework Bootstrap, maka kalian perlu menambahkan 2 baris script JS ini dibawah script JS yang sudah kalian buat sebelumnya.

    <head>\n    ...\n    <script src=\"https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js\" integrity=\"sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js\" integrity=\"sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+\" crossorigin=\"anonymous\"></script>\n</head>\n

Referensi: Get Started with Bootstrap 5.3

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-navbar-pada-aplikasi","title":"Tutorial: Menambahkan navbar pada Aplikasi","text":"

Tambahkan navigation bar (boleh menggunakan Bootstrap) pada halaman main.html kamu. Tampilkan nama kamu dan tombol logout pada navigation bar yang kamu buat. Kamu dapat referensi cara membuat navigation bar pada Bootstrap dengan dokumentasi berikut dan kreasikan navigation bar sesukamu.

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-fitur-edit-pada-aplikasi","title":"Tutorial: Menambahkan Fitur Edit pada Aplikasi","text":"
  1. Buka views.py yang ada pada subdirektori main, dan buatlah fungsi baru bernama edit_book yang menerima parameter request dan id.

  2. Tambahkan potongan kode berikut pada fungsi edit_book

    def edit_book(request, id):\n    # Get book berdasarkan ID\n    book = Book.objects.get(pk = id)\n\n    # Set book sebagai instance dari form\n    form = BookForm(request.POST or None, instance=book)\n\n    if form.is_valid() and request.method == \"POST\":\n        # Simpan form dan kembali ke halaman awal\n        form.save()\n        return HttpResponseRedirect(reverse('main:show_main'))\n\n    context = {'form': form}\n    return render(request, \"edit_book.html\", context)\n
  3. Buatlah berkas HTML baru dengan nama edit_book.html pada subdirektori main/templates. Isi berkas tersebut dengan template berikut.

    {% extends 'base.html' %}\n\n{% load static %}\n\n{% block content %}\n\n<h1>Edit Book</h1>\n\n<form method=\"POST\">\n    {% csrf_token %}\n    <table>\n        {{ form.as_table }}\n        <tr>\n            <td></td>\n            <td>\n                <input type=\"submit\" value=\"Edit Book\"/>\n            </td>\n        </tr>\n    </table>\n</form>\n\n{% endblock %}\n
  4. Buka urls.py yang berada pada direktori main dan import fungsi edit_book yang sudah dibuat.

    from main.views import edit_book\n
  5. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.

    ...\npath('edit-book/<int:id>', edit_book, name='edit_book'),\n...\n
  6. Buka main.html yang berada pada subdirektori main/templates. Tambahkan potongan kode berikut sejajar dengan elemen <td> terakhir agar terlihat tombol edit pada setiap baris tabel.

    ...\n<tr>\n    ...\n    <td>\n        <a href=\"{% url 'main:edit_book' book.pk %}\">\n            <button>\n                Edit\n            </button>\n        </a>\n    </td>\n</tr>\n...\n
  7. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000 di browser favoritmu. Setelah login, coba untuk meng-edit data suatu buku. Apabila setelah di-submit perubahan tersimpan dan tercermin pada halaman utama aplikasi tanpa error, maka selamat, kamu berhasil menambahkan fitur edit!

"},{"location":"tutorial/tutorial-4/#tutorial-membuat-fungsi-untuk-menghapus-data-buku","title":"Tutorial: Membuat Fungsi untuk Menghapus Data Buku","text":"

Berikut adalah yang perlu kamu lakukan untuk membuat fungsi penghapusan data buku.

  1. Buat fungsi baru dengan nama delete_book yang menerima parameter request dan id pada views.py di folder main untuk menghapus data buku. Kamu dapat menggunakan templat kode berikut untuk memuat fungsinya.

    Jangan lupa untuk memahami isi kodenya, ya. \ud83d\ude09

    def delete_book(request, id):\n    # Get data berdasarkan ID\n    book = Book.objects.get(pk = id)\n    # Hapus data\n    book.delete()\n    # Kembali ke halaman awal\n    return HttpResponseRedirect(reverse('main:show_main'))\n
  2. Buka urls.py yang ada pada folder main dan impor fungsi yang sudah kamu buat tadi.

    from main.views import delete_book\n
  3. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor.

    ...\npath('delete/<int:id>', delete_book, name='delete_book'), # sesuaikan dengan nama fungsi yang dibuat\n...\n
  4. Bukalah berkas main.html yang ada pada folder main/templates dan ubahlah kode yang sudah ada menjadi seperti berikut agar terdapat tombol hapus untuk setiap buku.

    ...\n<tr>\n    ...\n    <td>\n        <a href=\"{% url 'main:edit_book' book.pk %}\">\n            <button>\n                Edit\n            </button>\n        </a>\n        <a href=\"{% url 'main:delete_book' book.pk %}\">\n              <button>\n                  Delete\n              </button>\n          </a>\n    </td>\n</tr>\n...\n

Jalankan proyek Django-mu dan cobalah untuk menghapus data buku yang sudah ada pada browser favoritmu.

"},{"location":"tutorial/tutorial-4/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu telah menyelesaikan Tutorial 4 dengan baik. \ud83d\ude04

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  1. Kamu juga diharapkan untuk melakukan eksplorasi dengan menggunakan CSS Framework pada tutorial ini. Berikut adalah contoh penerapan Bootstrap sederhana pada aplikasi Book Tracker.

  2. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  3. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-4/#referensi-tambahan","title":"Referensi Tambahan","text":"

Kamu dapat membuka beberapa tautan dibawah untuk melihat beberapa opsi kode yang dapat kamu gunakan untuk menambahkan navigation bar - Dengan menggunakan Bootstrap, dapat diakses melalui link ini - Dengan menggunakan CSS secara manual, dapat diakses melalui link ini

"},{"location":"tutorial/tutorial-4/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-4/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2023 dan PBP Genap 2023 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-5/","title":"Tutorial 5: JavaScript dan AJAX","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-5/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-5/#javascript","title":"JavaScript","text":""},{"location":"tutorial/tutorial-5/#pengenalan-javascript","title":"Pengenalan JavaScript","text":"

JavaScript merupakan bahasa pemrograman multi-paradigma tingkat tinggi lintas platform (cross-platform high-level multi-paradigm programming language). Sifat multi-paradigma membuat JavaScript mendukung konsep pemrograman berbasis obyek, pemrograman imperatif, dan pemrograman fungsional. JavaScript sendiri merupakan implementasi dari ECMAScript, yang merupakan inti dari bahasa JavaScript. Beberapa implementasi lain dari ECMAScript yang mirip dengan JavaScript antara lain JScript (Microsoft) dan ActionScript (Adobe).

JavaScript, bersama dengan HTML dan CSS, menjadi tiga teknologi utama yang dipakai pada pengembangan web. Pada dasarnya, keuntungan menggunakan JavaScript dalam pengembangan web adalah manipulasi halaman web dapat dilakukan secara dinamis dan interaksi antara halaman web dengan pengguna dapat meningkat. Oleh karena itu, hampir semua situs web modern saat ini menggunakan JavaScript dalam halaman web mereka untuk memberikan pengalaman terbaik kepada pengguna. Beberapa contoh yang dapat kita lakukan dengan menggunakan JavaScript antara lain menampilkan informasi berdasarkan waktu, mengenali jenis peramban pengguna, melakukan validasi form atau data, membuat cookies (bukan kue, namun HTTP cookies), mengganti styling dan CSS suatu element secara dinamis, dan lain sebagainya.

Pada pengembangan web umumnya kode JavaScript digunakan pada client-side suatu web (client-side JavaScript), namun beberapa jenis kode JavaScript saat ini digunakan pada server-side suatu web (server-side JavaScript) seperti node.js. Istilah client-side menunjukkan bahwa kode JavaScript akan dieksekusi atau dijalankan pada peramban pengguna, bukan pada server situs web. Hal ini berarti kompleksitas kode JavaScript tidak akan memengaruhi performa server situs web tersebut namun memengaruhi performa peramban web dan komputer; semakin kompleks kode JavaScript, maka semakin banyak memori komputer yang dikonsumsi oleh peramban web.

Pada mata kuliah PBP, kita hanya akan fokus kepada kode client-side JavaScript.

"},{"location":"tutorial/tutorial-5/#tahapan-eksekusi-javascript-oleh-peramban","title":"Tahapan Eksekusi JavaScript oleh Peramban","text":"

Perhatikan diagram berikut untuk mengamati tahapan eksekusi JavaScript oleh peramban web.

Setelah peramban mengunduh halaman HTML web maka tepat dimana tag <script></script> berada, peramban akan melihat tag script tersebut, apakah tag tersebut berisi kode embedded JavaScript atau merujuk berkas eksternal JavaScript. Jika merujuk pada berkas eksternal JavaScript, maka peramban akan mengunduh berkas tersebut terlebih dahulu.

"},{"location":"tutorial/tutorial-5/#penulisan-javascript","title":"Penulisan JavaScript","text":"

Penulisan JavaScript dapat dilakukan dengan embedded JavaScript atau external JavaScript. Kode JavaScript dapat didefinisikan atau dituliskan secara embedded pada berkas HTML maupun secara terpisah pada berkas tersendiri. Jika ditulis dalam berkas terpisah dari HTML, ekstensi berkas yang digunakan untuk berkas JavaScript adalah .js. Berikut contoh beberapa pendefinisian dari JavaScript.

JavaScript dapat diletakkan pada head atau body dari halaman HTML. Selain itu, kode JavaScript harus dimasukkan di antara tag <script> dan </script>. Kamu dapat meletakkan lebih dari satu tag script yang berisi JavaScript pada suatu berkas HTML.

"},{"location":"tutorial/tutorial-5/#embedded-javascript-pada-html","title":"Embedded JavaScript pada HTML","text":"

index.html

<script type=\"text/JavaScript\">\n  alert(\"Hello World!\");\n</script>\n
"},{"location":"tutorial/tutorial-5/#external-javascript-pada-html","title":"External JavaScript pada HTML","text":"

index.html

<script type=\"text/JavaScript\" src=\"js/script.js\"></script>\n

js/script.js

alert(\"Hello World!\");\n

Pada berkas eksternal JavaScript, tag <script> tidak perlu lagi ditambahkan.

Memisahkan JavaScript pada berkas tersendiri dapat memberikan beberapa keuntungan seperti kode dapat digunakan di berkas HTML lain, kode JavaScript dan HTML tidak bercampur sehingga lebih fokus saat mengembangkan aplikasi, serta mempercepat proses pemuatan halaman. berkas .js biasanya akan di-cache oleh peramban sehingga jika kita membuka halaman yang sama dan tidak ada perubahan pada berkas .js, maka peramban tidak akan meminta berkas .js tersebut kepada server lagi, namun akan menggunakan berkas dari cache yang sudah disimpan sebelumnya.

"},{"location":"tutorial/tutorial-5/#eksekusi-javascript","title":"Eksekusi JavaScript","text":"

Setelah JavaScript sudah dimuat dengan sempurna, maka peramban akan langsung mulai mengeksekusi kode JavaScript. Jika kode tersebut BUKAN merupakan event-triggered, maka kode langsung dieksekusi. Jika kode tersebut merupakan event-triggered, maka kode tersebut hanya akan dieksekusi jika event yang didefinisikan terpicu (triggered).

// langsung dieksekusi\nalert(\"Hello World\");\n\n// langsung dieksekusi\nvar obj = document.getElementById(\"object\");\n// langsung dieksekusi, menambahkan event handler onclick untuk element object\nobj.onclick = function () {\n  // hanya dieksekusi jika element 'object' di klik\n  alert(\"You just clicked the object!\");\n};\n
"},{"location":"tutorial/tutorial-5/#sintaks-javascript","title":"Sintaks JavaScript","text":""},{"location":"tutorial/tutorial-5/#variabel","title":"Variabel","text":"

Mendefinisikan variabel pada JavaScript cukup mudah. Contohnya seperti berikut.

var example = 0; // var example merupakan sebuah bilangan\nvar example = \"example\"; // var example merupakan sebuah string\nvar example = true; // var example merupakan sebuah boolean\n

JavaScript dapat menampung banyak tipe data; mulai dari string, integer, hingga object sekalipun. Berbeda dengan Java yang penandaan tipe datanya dibedakan dengan head variable (contohnya kamu ingin membuat variabel dengan tipe data int, maka sintaknya seperti int x = 9), JavaScript mempunyai ciri khas loosely typed atau dynamic language, yakni kamu tidak perlu menuliskan tipe data pada head variable dan JavaScript nantinya akan secara otomatis membaca tipe data kamu berdasarkan standar yang ada (seperti pada contoh di atas).

Ada beberapa aturan dalam pemilihan indentifiers atau nama variabel dalam JavaScript. Karakter pertama harus merupakan alfabet, underscore (_), atau karakter dolar ($). Selain itu, JavaScript identifiers bersifat case sensitive.

"},{"location":"tutorial/tutorial-5/#penggabungan-string","title":"Penggabungan String","text":"

Dalam JavaScript, kita juga dapat menyambungkan string dengan string lainnya seperti pada Java.

var str1 = \"PBP\" + \" \" + \"Fun\";\nvar str2 = \"PBP\";\nvar str3 = \"Fun\";\nvar str4 = str2 + \" \" + str3;\nvar str5 = \"Fun\";\nvar str6 = `PBP ${str5}`;  // Memiliki hasil yang sama seperti \"PBP\" + \" \" + str5\n
"},{"location":"tutorial/tutorial-5/#ruang-lingkup-javascript","title":"Ruang Lingkup JavaScript","text":""},{"location":"tutorial/tutorial-5/#variabel-lokal","title":"Variabel Lokal","text":"

Variabel yang didefinisikan di dalam fungsi bersifat lokal, sehingga hanya dapat diakses oleh kode didalam fungsi tersebut.

// kode diluar fungsi thisFunction() tidak dapat mengakses variabel courseName\nfunction thisFunction() {\n  var courseName = \"PBP\";\n  // kode di dalam fungsi ini dapat mengakses variabel courseName\n}\n
"},{"location":"tutorial/tutorial-5/#variabel-global","title":"Variabel Global","text":"

Variabel yang didefinisikan di luar fungsi bersifat global dan dapat diakses oleh kode lain dalam berkas JavaScript tersebut.

var courseName = \"PBP\";\nfunction thisFunction() {\n  // kode di dalam fungsi ini dapat mengakses variabel courseName\n}\n
"},{"location":"tutorial/tutorial-5/#variabel-auto-global","title":"Variabel Auto Global","text":"

Value yang di-assign pada variabel yang belum dideklarasikan otomatis menjadi variabel global, walaupun variabel tersebut berada di dalam suatu fungsi.

thisFunction(); // fungsi thisFunction() perlu dipanggil terlebih dahulu\nconsole.log(courseName); // cetak \"PBP\" pada JavaScript console\nfunction thisFunction() {\n  courseName = \"PBP\";\n}\n
"},{"location":"tutorial/tutorial-5/#mengakses-variabel-global-dari-html","title":"Mengakses Variabel Global dari HTML","text":"

Kamu dapat mengakses variabel yang berada dalam berkas JavaScript pada berkas HTML yang memuat berkas JavaScript tersebut.

...\n<input type=\"text\" onclick=\"this.value=courseName\" />\n...\n
...\nvar courseName = \"PBP\";\n...\n
"},{"location":"tutorial/tutorial-5/#function-dan-event","title":"Function dan Event","text":"

Function adalah sekumpulan grup dari kode-kode yang bisa dipanggil di mana pun pada bagian kode program (mirip dengan method pada Java). Hal ini mengurangi redundansi kode yang ada (mengurangi kode-kode yang dapat sama berulang-ulang). Selain itu, function pada JavaScript sangat berguna untuk memudahkan elemen pemanggilan secara dinamis. Function dapat dipanggil sesama function dan dapat juga dipanggil karena event (akan dijelaskan di bawah). Sebagai contoh, berikut kode yang terdapat pada index.html.

...\n<input type=\"button\" value=\"magicButton\" id=\"magicButton\" onclick=\"hooray();\" />\n...\n

Kemudian berikut adalah kode pada javascript.js.

...\nfunction hooray(){\n    alert(\"Yahoo!\");\n}\n...\n

Apabila magicButton ditekan, maka fungsi onclick akan menjalankan function hooray() pada javascript.js, lalu muncul alert sesuai yang sudah di-assign sebelumnya.

Kode onclick sebenarnya adalah salah satu contoh kemampuan JavaScript yang disebut event. Event adalah kemampuan JavaScript untuk membuat sebuah situs web dinamis. Maksud dari onclick adalah penanda apa yang akan dilakukan JavaScript jika elemen tersebut ditekan. Selain itu, event biasanya diberikan sebuah fungsi yang berguna sebagai perintah-perintah untuk JavaScript. Selain itu, banyak contoh-contoh event lainnya seperti onchange, onmouseover, onmouseout, dan lain sebagainya yang bisa kamu baca pada tautan ini.

"},{"location":"tutorial/tutorial-5/#javascript-dom","title":"JavaScript DOM","text":""},{"location":"tutorial/tutorial-5/#html-dom","title":"HTML DOM","text":"

HTML DOM (Document Object Model) adalah standar bagaimana mengubah, mengambil, dan menghapus HTML elements. HTML DOM dapat diakses melalui JavaScript atau dengan bahasa pemrograman lainnya. Detail lengkapnya dapat dilihat di sini.

Berikut adalah contoh implementasinya.

...     \n<div>\n  <p onclick=\"myFunction()\" id=\"demo\">Example of HTML DOM</p>\n\n</div>\n...\n
...\n    function myFunction() {\ndocument.getElementById(\"demo\").innerHTML = \"YOU CLICKED ME!\";\n    }\n...\n
"},{"location":"tutorial/tutorial-5/#css-dom","title":"CSS DOM","text":"

Sama dengan HTML DOM, CSS DOM dapat mengubah CSS secara dinamis melalui JavaScript. Detail lengkapnya dapat dilihat di sini.

Berikut adalah contoh implementasinya.

index.html

...\n<p id=\"blueText\" onclick=\"changeColor()\">Click me v2</p>\n...\n

javascript.js

...\nfunction changeColor(){\n    document.getElementById(\"blueText\").style.color=\"blue\";\n}\n...\n
"},{"location":"tutorial/tutorial-5/#ajax","title":"AJAX","text":""},{"location":"tutorial/tutorial-5/#pengenalan-ajax","title":"Pengenalan AJAX","text":"

AJAX merupakan singkatan dari A*synchronous JavaScript And X*ML.

AJAX bukanlah merupakan sebuah bahasa pemrograman, melainkan sebuah teknologi yang memadukan peramban web (untuk meminta data dari web server) dengan JavaScript dan HTML DOM (untuk menampilkan data). AJAX dapat menggunakan XML untuk mengirim data, tetapi AJAX juga dapat menggunakan teks ataupun JSON untuk mengirim data. AJAX memungkinkan halaman web untuk memperbarui data secara asinkronus dengan mengirimkan data ke peladen di balik layar. Hal tersebut berarti bahwa kita dapat memperbarui sebagian elemen data pada halaman tanpa harus me-reload halaman secara keseluruhan.

Berikut ini adalah diagram cara kerja AJAX.

  1. Sebuah event terjadi pada halaman web (contohnya tombol submit data ditekan)
  2. Sebuah XMLHttpRequest object dibuat oleh JavaScript
  3. XMLHttpRequest object mengirimkan request ke server
  4. Server memproses request tersebut
  5. Server mengembalikan response kembali kepada halaman web
  6. Response dibaca oleh JavaScript
  7. Aksi berikutnya akan dipicu oleh JavaScript sesuai dengan langkah yang dibuat (contohnya memperbarui data di halaman tersebut)

Pada PBP kali ini, kamu akan melakukan AJAX pada peramban web dengan menggunakan fungsi fetch() yang diberikan oleh JavaScript. Secara gambaran besar, penggunaan fetch() untuk melakukan pemanggilan AJAX dapat dilihat di tautan ini.

"},{"location":"tutorial/tutorial-5/#fetch-api","title":"Fetch API","text":"

Fetch API merupakan API baru yang diperkenalkan pada ECMAScript 2020 sebagai standar baru untuk membuat request dengan Promise. Fetch API menyediakan antarmuka untuk mengambil sumber daya (termasuk di seluruh jaringan). API ini merupakan pengganti yang lebih kuat dan fleksibel untuk XMLHttpRequest. Fetch API secara umum digunakan untuk mengimplementasikan AJAX secara lebih mudah daripada AJAX dengan XMLHttpRequest. Fetch API juga mendukung lebih banyak metode HTTP dan header HTTP daripada AJAX biasa.

Fungsi fetch() memiliki beberapa parameter, yaitu:

Fungsi fetch() mengembalikan objek Response. Objek Response memiliki beberapa properti, yaitu:

Kamu dapat mempelajari Fetch API lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#fungsi-async-dan-await","title":"Fungsi Async dan Await","text":"

Sebelum mempelajari penggunaan fungsi fetch(), ada baiknya kita mempelajari fungsi async dan await yang memungkinkan pengimplementasian AJAX tanpa perlu menggunakan library eksternal, seperti jQuery.

Fungsi async dan await merupakan fungsi baru yang diperkenalkan di ECMAScript 2017. Fungsi async digunakan untuk menandai fungsi sebagai fungsi yang dapat mengembalikan nilai secara asinkronus, sedangkan fungsi await digunakan untuk menunggu hasil dari fungsi async.

Kamu dapat mempelajari fungsi async dan await lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#penggunaan-fetch-api","title":"Penggunaan Fetch API","text":"

Fetch API menyediakan antarmuka JavaScript untuk mengakses dan memanipulasi bagian-bagian protokol, seperti requests dan responses. API ini juga menyediakan metode fetch() global yang menyediakan cara yang mudah dan logis untuk mengambil sumber daya secara asinkronus pada seluruh jaringan.

Tidak seperti XMLHttpRequest yang merupakan API berbasis callback, Fetch API berbasis Promise dan menyediakan alternatif yang lebih baik dan dapat dengan mudah digunakan pada service worker. Fetch API juga mengintegrasikan konsep HTTP tingkat lanjut seperti CORS dan ekstensi lain ke HTTP.

Berikut adalah contoh penggunaan Fetch API dengan fungsi async dan await untuk melakukan AJAX.

async function fetchData() {\n  const response = await fetch(\"https://jokes-bapack2-api.yuana.id/v1/text/random\");\n  const data = await response.json();\n  return data;\n}\n\nconst joke = await fetchData();\nconsole.log(joke);\n

Kode di atas akan melakukan AJAX untuk meminta data dari API lelucon bapak-bapak masa kini secara asinkronus. Hasil dari AJAX akan disimpan dalam variabel joke.

Kamu dapat mempelajari penggunaan Fetch API lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#tutorial-membuat-fungsi-untuk-menambahkan-buku-dengan-ajax","title":"Tutorial: Membuat Fungsi untuk Menambahkan Buku dengan AJAX","text":"

Pada bagian ini, kamu akan membuat fungsi pada views untuk menambahkan buku baru ke basis data dengan AJAX.

  1. Buatlah fungsi baru pada views.py dengan nama add_book_ajax yang menerima parameter request.

  2. Impor from django.views.decorators.csrf import csrf_exempt pada berkas views.py.

  3. Tambahkan dekorator @csrf_exempt di atas fungsi add_book_ajax yang sudah kamu buat.

  4. Isilah fungsi tersebut dengan kode berikut.

    ...\n@csrf_exempt\ndef add_book_ajax(request):\n    if request.method == 'POST':\n        name = request.POST.get(\"name\")\n        page = request.POST.get(\"page\")\n        description = request.POST.get(\"description\")\n        user = request.user\n\n        new_book = Book(name=name, page=page, description=description, user=user)\n        new_book.save()\n\n        return HttpResponse(b\"CREATED\", status=201)\n\n    return HttpResponseNotFound()\n

    Penjelasan Kode:

"},{"location":"tutorial/tutorial-5/#tutorial-menambahkan-routing-untuk-fungsi-add_book_ajax","title":"Tutorial: Menambahkan Routing Untuk Fungsi add_book_ajax","text":"
  1. Buka berkas urls.py pada folder main dan impor fungsi add_book_ajax.

  2. Tambahkan path url fungsi tersebut ke dalam urlpatterns.

    ...\npath('create-book-ajax/', add_book_ajax, name='add_book_ajax'),\n
"},{"location":"tutorial/tutorial-5/#tutorial-menampilkan-data-book-dengan-fetch-api","title":"Tutorial: Menampilkan Data Book dengan Fetch() API","text":"
  1. Bukalah berkas main.html pada main/templates dan hapuslah bagian kode table yang sudah kamu buat pada tutorial sebelumnya.

  2. Tambahkanlah kode berikut sebagai struktur table.

    <table id=\"book_table\"></table>\n
  3. Buatlah block <Script> di bagian bawah berkas kamu dan buatlah fungsi baru pada block <Script> tersebut dengan nama getBooks().

    <script>\n    async function getBooks() {\n        return fetch(\"{% url 'main:show_json' %}\").then((res) => res.json())\n    }\n</script>\n

    Penjelasan Kode:

  4. Buatlah fungsi baru pada block <Script> dengan nama refreshBooks() yang digunakan untuk me-refresh data buku secara asynchronous.

    <script>\n    ...\n    async function refreshBooks() {\n        document.getElementById(\"book_table\").innerHTML = \"\"\n        const books = await getBooks()\n        let htmlString = `<tr>\n            <th>Name</th>\n            <th>Page</th>\n            <th>Description</th>\n            <th>Date Added</th>\n        </tr>`\n        books.forEach((item) => {\n            htmlString += `\\n<tr>\n            <td>${item.fields.name}</td>\n            <td>${item.fields.page}</td>\n            <td>${item.fields.description}</td>\n            <td>${item.fields.date_added}</td>\n        </tr>` \n        })\n\n        document.getElementById(\"book_table\").innerHTML = htmlString\n    }\n\n    refreshBooks()\n</script>\n

    Penjelasan Kode:

"},{"location":"tutorial/tutorial-5/#tutorial-membuat-modal-sebagai-form-untuk-menambahkan-buku","title":"Tutorial: Membuat Modal Sebagai Form untuk Menambahkan Buku","text":"
  1. Tambahkan kode berikut untuk mengimplementasikan modal (Bootstrap) pada aplikasi kamu.

    ...\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">Add New Book</h1>\n                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n                <form id=\"form\" onsubmit=\"return false;\">\n                    {% csrf_token %}\n                    <div class=\"mb-3\">\n                        <label for=\"name\" class=\"col-form-label\">Name:</label>\n                        <input type=\"text\" class=\"form-control\" id=\"name\" name=\"name\"></input>\n                    </div>\n                    <div class=\"mb-3\">\n                        <label for=\"page\" class=\"col-form-label\">Page:</label>\n                        <input type=\"number\" class=\"form-control\" id=\"page\" name=\"page\"></input>\n                    </div>\n                    <div class=\"mb-3\">\n                        <label for=\"description\" class=\"col-form-label\">Description:</label>\n                        <textarea class=\"form-control\" id=\"description\" name=\"description\"></textarea>\n                    </div>\n                </form>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n                <button type=\"button\" class=\"btn btn-primary\" id=\"button_add\" data-bs-dismiss=\"modal\">Add Book</button>\n            </div>\n        </div>\n    </div>\n</div>\n...\n

    Form pada modal tersebut sudah disesuaikan untuk model pada aplikasi book_tracker.

    Kamu dapat membaca dokumentasi lebih lanjut mengenai modal pada Bootstrap di sini.

  2. Menambahkan button yang berfungsi untuk menampilkan modal.

    ...\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\">\n    Add Book by AJAX\n</button>\n...\n
"},{"location":"tutorial/tutorial-5/#tutorial-menambahkan-data-book-dengan-ajax","title":"Tutorial: Menambahkan Data Book dengan AJAX","text":"

Modal dengan form yang telah kamu buat sebelumnya belum bisa digunakan untuk menambahkan data buku. Oleh karena itu, kamu perlu membuat fungsi JavaScript baru untuk menambahkan data berdasarkan input ke basis data secara AJAX.

  1. Buatlah fungsi baru pada block <Script> dengan nama addBook(). Isilah fungsi tersebut dengan kode berikut.

    <script>\n    ...\n    function addBook() {\n        fetch(\"{% url 'main:add_book_ajax' %}\", {\n            method: \"POST\",\n            body: new FormData(document.querySelector('#form'))\n        }).then(refreshBooks)\n\n        document.getElementById(\"form\").reset()\n        return false\n    }\n</script>\n

    Penjelasan Kode:

  2. Tambahkan fungsi onclick pada button \"Add Book\" pada modal untuk menjalankan fungsi addBook() dengan menambahkan kode berikut.

    <script>\n...\ndocument.getElementById(\"button_add\").onclick = addBook\n</script>\n

Selamat! Kamu telah berhasil membuat aplikasi yang dapat menambahkan data secara AJAX. Bukalah http://localhost:8000/ dan cobalah untuk mmenambahkan data buku baru pada aplikasi. Seharusnya, sekarang aplikasi tidak perlu melakukan reload setiap kali data buku baru ditambahkan.

"},{"location":"tutorial/tutorial-5/#penutup","title":"Penutup","text":"

Selamat! Kamu telah menyelesaikan Tutorial 5 mengenai AJAX dengan baik. \ud83d\ude04

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  1. Kamu juga seharusnya sudah dapat menambahkan buku secara asynchronous dengan menggunakan modal AJAX.

  2. Lakukan add, commit dan push untuk memperbarui repositori GitHub. Jalankan perintah berikut untuk melakukan add, commit dan push.

    git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-5/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-5/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-5/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2023 dan PBP Genap 2023 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":[" "]},"docs":[{"location":"","title":"Beranda","text":"

Selamat datang di Pemrograman Berbasis Platform Semester Genap 2023/2024. Situs web ini akan memuat informasi terkait dengan perkuliahan yang akan dipublikasikan secara rutin, seperti dokumen tutorial, tugas individu, dan tugas kelompok. Harap cek situs web ini secara berkala.

"},{"location":"#dosen","title":"Dosen","text":"

Arawinda Dinakaramani, S.Kom., M.Hum.

"},{"location":"#asisten-dosen","title":"Asisten Dosen","text":"
  1. Muhammad Iqbal Dwitama (MID) - Koordinator Asisten Dosen
  2. Muhammad Nabil Mu'afa (BIL)
"},{"location":"tk/pts/","title":"Proyek Tengah Semester PBP","text":"

Membuat Situs Web menggunakan Framework Django (Berkelompok)

"},{"location":"tk/pts/#tujuan-pembelajaran-khusus","title":"Tujuan Pembelajaran Khusus","text":"
  1. Merancang halaman web
  2. Mengimplementasikan website menggunakan framework Django dengan memenuhi Models, Views, dan Templates
  3. Memanfaatkan framework CSS untuk mewujudkan Responsive Web Design
  4. Mengimplementasikan Unit Test & deployment (bonus)
"},{"location":"tk/pts/#catatan","title":"Catatan","text":"

Perlu diperhatikan selain tujuan pembelajaran khusus seperti tertulis di atas, peserta kuliah juga perlu mempelajari dan dilatih beberapa aspek kecendekiaan sebagai calon sarjana. Di antaranya yang relevan dalam kuliah ini adalah keteguhan (grit), kemandirian, ketelitian, termasuk juga metakognitif (secara sederhana bisa diartikan kemampuan mengatur strategi belajar yang sesuai dengan dirinya meliputi perencanaan, monitoring dan evaluasi proses belajar mandiri), termasuk di dalamnya kemampuan untuk memahami, mengkomunikasikan masalah, diskusi dan bertanya, sehingga peserta kuliah juga perlu siap bersikap positif dengan kondisi-kondisi yang secara tidak langsung atau tidak pasti akan dihadapi dan mungkin dapat menghabiskan banyak waktu. Kondisi tersebut bisa dianggap kendala, seperti keterbatasan sumber daya, bug tools, kesulitan teknis atau lainnya. Walaupun dirasakan menyulitkan, perlu diupayakan untuk disikapi dengan positif agar dapat menjadi manfaat terkait aspek kecendekiaan yang perlu dilatih peserta kuliah. Sikap negatif hanya akan memperburuk keadaan dan menghilangkan manfaat tugas ini untuk pembelajaran yang akan dapat dirasakan di kemudian hari. Tim asisten dan dosen melalui sarana yang ada, akan berusaha semampunya melayani pertanyaan, keluhan, dan membantu proses pembelajaran peserta agar peserta bisa menjalani perkuliahan dan belajar semaksimal mungkin.

Sebagai selingan, bila rekan-rekan lelah dan bingung menghadapi error yang belum kunjung terselesaikan, berikut ini ada video yang cukup populer dan mudah-mudahan bisa menambah semangat untuk tetap teguh mengerjakan dan berlatih demi kesuksesan di kemudian hari.

Selamat mengerjakan. \ud83d\ude04

"},{"location":"tk/pts/#aturan-umum-tugas-kelompok","title":"Aturan Umum Tugas Kelompok","text":"
  1. Satu kelompok terdiri atas 5-6 orang.
  2. Satu kelompok membuat satu repositori Git di dalam satu organisasi yang digunakan oleh seluruh anggota kelompok untuk bekerja sama. Kumpulkan tautan repositori ke Scele.
  3. Setiap kelompok dipersilakan mencari ide sendiri mengenai aplikasi yang akan dibuat. Tema aplikasi adalah makanan dan minuman (food and beverage). Tema ini dipilih karena tiga alasan:
  4. Setiap kelompok mengimplementasikan dataset makanan dan minuman dalam bentuk class Models dan menyimpan data dari dataset tersebut ke dalam database Django. Dataset makanan dan minuman harus berisi minimal 100 makanan dan/atau minuman. Sumber dataset makanan dan minuman boleh berasal dari mana saja, misalnya dari Kaggle. Contoh URL dataset yang dapat digunakan:
  5. Setiap anggota kelompok mengerjakan modul yang berbeda. Modul ditentukan oleh kelompok yang disesuaikan dengan ide aplikasi yang sudah didiskusikan dalam kelompok.
  6. Tugas kelompok dikumpulkan sebagai kesatuan aplikasi web.
"},{"location":"tk/pts/#aturan-khusus-per-anggota-kelompok","title":"Aturan Khusus per Anggota Kelompok","text":"
  1. Menerapkan Models dengan membuat, memanfaatkan yang sudah disediakan Django, atau memanfaatkan yang sudah dibuat oleh anggota kelompok (di modul lain).
  2. Menerapkan Views untuk memproses request dan mengolah data untuk menghasilkan respons menggunakan templat HTML maupun mengembalikan respons JSON.
  3. Menerapkan templat HTML dengan kerangka yang sistematis dan efisien, seperti base.html, header.html, dan footer.html.
  4. Menerapkan responsive framework pada templat HTML (seperti Bootstrap atau Tailwind).
  5. Memiliki halaman form yang dapat menerima masukan dari pengguna kemudian diproses oleh Views. Contoh pemrosesan oleh Views adalah insert data ke dalam Models, query data dari Models, dan update data pada Models.
  6. Menerapkan JavaScript dengan pemanggilan AJAX.
  7. Menerapkan filter informasi bagi pengguna yang sudah log in saja. Contohnya adalah data alamat, umur, dan nomor ponsel hanya dapat dilihat oleh pengguna yang sudah log in saja.
  8. Menerapkan filter pada dataset makanan dan minuman yang ditampilkan. Contohnya adalah menampilkan daftar makanan dan minuman berdasarkan harga.
"},{"location":"tk/pts/#tahapan-tugas-kelompok","title":"Tahapan Tugas Kelompok","text":"

Tahapan dan deliverables Tenggat Waktu dan Keterangan Tahap I (40%)

Tenggat Waktu: Rabu, 13 Maret 2024, pukul 23:55 WIB Kumpulkan tautan GitHub dengan code base proyek Django yang sudah disiapkan di GitHub ke slot submisi yang tersedia di SCELE. Tahap II (60%)

(Modul sudah terimplementasi dengan baik)

Tenggat Waktu: Rabu, 17 April 2024, pukul 23.55 WIB

Kriteria Submisi: Seluruh modul yang dikerjakan oleh setiap anggota kelompok sudah muncul dan dapat diakses pada proyek Django

Bonus (5%)

"},{"location":"tugas/tugas-1/","title":"Tugas 1: Menulis Esai","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-1/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Tulislah sebuah esai minimal 1000 kata yang mengandung poin-poin sebagai berikut.

  1. Pilihlah salah satu platform yang telah dijelaskan dalam Slide 1. Sebutkan nama platform yang Anda pilih.

  2. Sebutkan 3 perangkat dan teknologi yang tergolong dalam platform tersebut yang pernah Anda gunakan.

  3. Untuk masing-masing perangkat dan teknologi yang Anda sebutkan, ceritakan pengalaman Anda saat\u00a0menggunakannya.

  4. Menurut Anda, apakah ada satu platform yang paling penting di antara semua programming platform? Jika ada, platform apa dan mengapa platform tersebut paling penting? Jika tidak ada, jelaskan\u00a0alasannya!

"},{"location":"tugas/tugas-1/#pengumpulan","title":"Pengumpulan","text":"

Tugas dikumpulkan dalam format Portable Document File (*.pdf) dengan ketentuan nama berkas NPM_Nama_Tugas 1.pdf.

"},{"location":"tugas/tugas-1/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 1 adalah hari Selasa, 6 Februari 2024, pukul 12.00 siang.

Harap mengumpulkan esai yang telah kamu buat ke dalam slot submisi yang telah disediakan di SCELE.

"},{"location":"tugas/tugas-1/#rubrik-penilaian","title":"Rubrik Penilaian","text":"
  1. Orisinalitas karya dan keatraktifan judul (10 poin)
  2. Format penulisan (10 poin)
  3. Penggunaan bahasa Indonesia yang baik dan benar (15 poin)
  4. Ketajaman analisis permasalahan (30 poin)
  5. Kelengkapan konten esai (15 poin)
  6. Simpulan dan saran (15 poin)
  7. Referensi (5 poin)
"},{"location":"tugas/tugas-2/","title":"Tugas 2: Implementasi Model-View-Template (MVT) pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-2/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan konsep Model-View-Template serta beberapa hal yang sudah kamu pelajari di kelas dan tutorial. Perlu diperhatikan bahwa proyek yang dibuat pada tugas berbeda dengan proyek yang digunakan pada tutorial.

"},{"location":"tugas/tugas-2/#tema-aplikasi","title":"Tema Aplikasi","text":"

Tema besar aplikasi untuk tugas PBP adalah aplikasi tracker. Pada semester ini, kamu diberikan kebebasan dalam memilih nama dan tema kecil aplikasi, kecuali book tracker yang sudah digunakan pada tutorial. Namun, aplikasi dari tugas kamu harus memiliki atribut-atribut berikut pada model aplikasimu.

Kamu dipersilakan untuk menambahkan atribut lainnya jika diinginkan, seperti date, category. Namun, model aplikasi kamu wajib memiliki ketiga atribut wajib di atas (name, amount, description). Nama dari ketiga atribut di atas dapat disesuaikan lagi dengan kebutuhan aplikasimu.

Beberapa contoh ide aplikasi pengelolaan yang dapat kamu buat adalah sebagai berikut.

"},{"location":"tugas/tugas-2/#checklist-tugas","title":"Checklist Tugas","text":"

Checklist untuk tugas ini adalah sebagai berikut.

Perhatikan bahwa kamu harus mengerjakan tugas ini menggunakan repositori yang berbeda dengan tutorial.

"},{"location":"tugas/tugas-2/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 2 adalah hari Selasa, 13 Februari, pukul 12.00 siang.

Harap mengumpulkan link repositori yang kamu gunakan ke dalam slot submisi yang telah disediakan di SCELE.

"},{"location":"tugas/tugas-3/","title":"Tugas 3: Implementasi Form dan Data Delivery pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-3/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan menjalankan implementasi konsep data delivery serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-3/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 3 adalah hari Selasa, 20 Februari, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-4/","title":"Tugas 4: Implementasi Autentikasi, Session, dan Cookies pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-4/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan konsep authentication, session, cookies, serta menerapkan beberapa konsep yang telah dipelajari selama sesi tutorial.

Kerjakan checklist untuk tugas ini secara berurutan:

"},{"location":"tugas/tugas-4/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 4 adalah Selasa, 27 Februari 2023, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-5/","title":"Tugas 5: Desain Web menggunakan HTML, CSS dan Framework CSS","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-5/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan desain web berdasarkan beberapa hal yang sudah kamu pelajari selama tutorial (CSS, Framework, dsb).

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-5/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 5 adalah Selasa, 5 Maret, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tugas/tugas-6/","title":"Tugas 6: JavaScript dan Asynchronous JavaScript","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tugas/tugas-6/#deskripsi-tugas","title":"Deskripsi Tugas","text":"

Pada tugas ini, kamu akan mengimplementasikan AJAX pada aplikasi yang telah kamu buat pada tugas sebelumnya.

Checklist untuk tugas ini adalah sebagai berikut:

"},{"location":"tugas/tugas-6/#tenggat-waktu-pengerjaan","title":"Tenggat Waktu Pengerjaan","text":"

Tenggat waktu pengerjaan Tugas 6 adalah Jumat, 15 Maret 2024, pukul 12.00 siang.

Asisten dosen akan mengecek last commit dari repositori tugas lab, sehingga kamu tidak perlu mengumpulkan tautan repositori ke dalam slot submisi.

"},{"location":"tutorial/tutorial-0/","title":"Tutorial 0: Konfigurasi dan Instalasi Git dan Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Ganjil 2023/2024

"},{"location":"tutorial/tutorial-0/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-0/#tutorial-pembuatan-akun-github-lewati-jika-sudah-ada","title":"Tutorial: Pembuatan Akun GitHub (Lewati Jika Sudah Ada)","text":""},{"location":"tutorial/tutorial-0/#pengenalan-tentang-git-dan-github","title":"Pengenalan Tentang Git dan GitHub","text":"

Pengenalan awal ini akan membantumu memahami dasar-dasar mengenai Git dan platform berbasis web yang dikenal sebagai GitHub.

"},{"location":"tutorial/tutorial-0/#git-sistem-kontrol-versi-yang-kuat","title":"Git: Sistem Kontrol Versi yang Kuat","text":""},{"location":"tutorial/tutorial-0/#github-platform-kolaborasi-menggunakan-git","title":"GitHub: Platform Kolaborasi Menggunakan Git","text":""},{"location":"tutorial/tutorial-0/#mengapa-penting","title":"Mengapa Penting?","text":"

Dengan pemahaman dasar mengenai Git dan GitHub, kamu siap untuk melangkah lebih jauh dalam dunia pengembangan perangkat lunak yang kolaboratif dan terstruktur.

"},{"location":"tutorial/tutorial-0/#langkah-1-membuat-akun-di-github","title":"Langkah 1: Membuat Akun di GitHub","text":"

Langkah selanjutnya adalah membuat akun di GitHub, yang akan memungkinkanmu untuk mulai berkolaborasi pada proyek-proyek menggunakan Git.

  1. Buka Situs Web GitHub

  2. Membuat Akun

  3. Isi Formulir Pendaftaran

  4. Verifikasi Akun Melalui Email

  5. Akun GitHub Siap Digunakan

Catatan:

"},{"location":"tutorial/tutorial-0/#selamat-kamu-telah-membuat-akun-github","title":"Selamat, Kamu Telah Membuat Akun GitHub","text":"

Kamu sekarang telah memiliki akun GitHub yang dapat digunakan untuk menyimpan proyek, berkolaborasi dengan orang lain, dan masih banyak lagi.

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-ide","title":"Tutorial: Instalasi IDE","text":"

IDE (Integrated Development Environment) adalah perangkat lunak yang membantu para pengembang dalam menulis, mengedit, dan mengelola kode. Berikut adalah langkah-langkah untuk memasang IDE.

"},{"location":"tutorial/tutorial-0/#langkah-1-pemilihan-text-editor-atau-ide","title":"Langkah 1: Pemilihan Text Editor atau IDE","text":"

Pilihlah text editor atau IDE yang sesuai dengan preferensimu. Beberapa pilihan populer yang dapat kamu pertimbangkan meliputi:

"},{"location":"tutorial/tutorial-0/#langkah-2-proses-instalasi","title":"Langkah 2: Proses Instalasi","text":"
  1. Pergi ke situs web resmi IDE yang kamu pilih.
  2. Ikuti petunjuk yang diberikan untuk mengunduh installer IDE.
  3. Jalankan installer dan ikuti instruksi di layar untuk menyelesaikan proses instalasi.
"},{"location":"tutorial/tutorial-0/#langkah-3-memulai-menggunakan-ide","title":"Langkah 3: Memulai Menggunakan IDE","text":"
  1. Setelah proses instalasi selesai, buka IDE yang telah terinstal.
  2. Eksplorasi antarmuka dan fitur yang disediakan oleh IDE untuk membantumu dalam pengembangan proyek.

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-dan-konfigurasi-git","title":"Tutorial: Instalasi dan Konfigurasi Git","text":""},{"location":"tutorial/tutorial-0/#langkah-1-instalasi-git","title":"Langkah 1: Instalasi Git","text":"

Jika Git belum terpasang pada sistem, kamu dapat mengikuti langkah-langkah berikut untuk menginstalnya.

  1. Buka situs web resmi Git di sini.
  2. Pilih sistem operasi yang sesuai (Windows, macOS, atau Linux) dan unduh installer yang sesuai.
  3. Jalankan installer yang telah diunduh dan ikuti petunjuk di layar untuk menyelesaikan proses instalasi.
"},{"location":"tutorial/tutorial-0/#langkah-2-konfigurasi-awal-git","title":"Langkah 2: Konfigurasi Awal Git","text":"

Setelah Git terpasang, langkah-langkah berikut akan membantumu mengatur konfigurasi awal sebelum mulai menggunakan Git.

  1. Buatlah sebuah folder/direktori baru untuk menyimpan proyek Git kamu, kemudian masuklah ke direktori tersebut.
  2. Salinlah path ke direktori yang sudah kamu buat.
  3. Buka terminal atau command prompt pada sistem, kemudian pindah ke direktori yang sudah kamu buat dengan menjalankan perintah cd <path_direktori>
  4. Inisiasi repositori baru dengan perintah git init. Perintah ini akan membuat repositori Git kosong di dalam direktori yang kamu tentukan.
"},{"location":"tutorial/tutorial-0/#langkah-3-konfigurasi-nama-pengguna-dan-email","title":"Langkah 3: Konfigurasi Nama Pengguna dan Email","text":"

Sebelum mulai berkontribusi ke repositori, konfigurasikan nama pengguna dan alamat email agar terhubung dengan commit-mu.

Atur username dan email yang akan diasosiasikan dengan pekerjaanmu ke repositori Git ini dengan menjalankan perintah di bawah ini. Sesuaikan dengan username dan email yang kamu gunakan pada GitHub.

git config --global user.name \"<NAME>\"\ngit config --global user.email \"<EMAIL>\"\n

Contoh:

git config --global user.name \"pakbepe\"\ngit config --global user.email \"pak.bepe@cs.ui.ac.id\"\n

Perlu diketahui bahwa flag --global akan mengubah konfigurasi global untuk seluruh sistem.

"},{"location":"tutorial/tutorial-0/#langkah-4-verifikasi-konfigurasi","title":"Langkah 4: Verifikasi Konfigurasi","text":"

Untuk memastikan konfigurasi telah diatur dengan benar pada repositori lokal, kamu dapat menjalankan perintah berikut.

git config --list\n

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-penggunaan-dasar-git","title":"Tutorial: Penggunaan Dasar Git","text":"

Repositori adalah tempat penyimpanan untuk proyek perangkat lunak, yang mencakup semua revisi dan perubahan yang telah dilakukan pada kode. Untuk mengeksekusi perintah-perintah Git, kamu dapat melakukannya pada repositori di GitHub, platform kolaboratif untuk mengelola proyek menggunakan Git.

"},{"location":"tutorial/tutorial-0/#langkah-1-melakukan-inisiasi-repositori-di-github","title":"Langkah 1: Melakukan Inisiasi Repositori di GitHub","text":"

Langkah pertama dalam penggunaan Git adalah melakukan inisiasi repositori di GitHub untuk memulai pelacakan perubahan pada proyekmu.

  1. Buka GitHub melalui peramban web.

  2. Buat Repositori Baru

  3. Tentukan Direktori Lokal

  4. Tambahkan Berkas README.md

  5. Cek Status dan Lakukan Tracking

  6. Commit Perubahan

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-2-menghubungkan-repositori-lokal-dengan-repositori-di-github","title":"Langkah 2: Menghubungkan Repositori Lokal dengan Repositori di GitHub","text":"

Setelah melakukan inisiasi repositori lokal, langkah selanjutnya adalah menghubungkannya dengan repositori di GitHub agar kamu dapat berkolaborasi dan menyimpan perubahan di platform daring tersebut.

  1. Buat Branch Utama Baru

  2. Hubungkan dengan Repositori di GitHub

  3. Lakukan Penyimpanan Pertama ke GitHub

  4. Lakukan Pengecekan Kembali

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-3-melakukan-cloning-terhadap-suatu-repositori","title":"Langkah 3: Melakukan Cloning terhadap Suatu Repositori","text":"

Cloning repositori adalah proses menduplikasi seluruh konten dari repositori yang ada di platform GitHub ke komputer lokal. Langkah-langkahnya adalah sebagai berikut.

  1. Buka halaman repositori di GitHub yang telah kamu buat sebelumnya.

  2. Salin URL Clone

  3. Clone Repositori ke Komputer Lokal

Saat ini, kamu memiliki tiga repositori:

  1. Repositori asli di komputer lokal.
  2. Repositori daring di GitHub yang terhubung dengan repositori lokal.
  3. Repositori baru hasil dari proses cloning yang terhubung dengan repositori GitHub.

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-4-melakukan-push-kepada-suatu-repositori","title":"Langkah 4: Melakukan Push kepada Suatu Repositori","text":"

Seperti yang sudah disinggung sebelumnya (Langkah 2), push adalah proses mengirimkan perubahan yang kamu lakukan di repositori lokal ke repositori di GitHub. Langkah-langkahnya adalah sebagai berikut.

  1. Buka kembali repositori lokal yang pertama kali kamu buat.

  2. Ubah isi berkas README.md dengan menambahkan atribut Hobi. Contohnya adalah sebagai berikut.

    Nama : Pak Bepe\n\nNPM : 2201234567\n\nKelas : PBP A\n\nHobi : Tidur\n
  3. Lakukan Push ke Repositori GitHub

  4. Lakukan Pengecekan Kembali

Catatan: Jika kamu ingin mengambil semua perubahan yang belum di-stage (ditandai untuk dimasukkan dalam commit) dari seluruh direktori proyek kamu, jalankan git add ..

"},{"location":"tutorial/tutorial-0/#langkah-5-melakukan-pull-dari-suatu-repositori","title":"Langkah 5: Melakukan Pull dari Suatu Repositori","text":"

Pull pada suatu repositori adalah proses mengambil perubahan terbaru dari repositori di GitHub dan menggabungkannya dengan repositori lokal.

  1. Buka kembali repositori lokal yang telah kamu clone sebelumnya di terminal atau command prompt.

  2. Jalankan Perintah Pull

  3. Lakukan Pengecekan Kembali

Catatan:

"},{"location":"tutorial/tutorial-0/#langkah-6-melakukan-branching-pada-suatu-repositori","title":"Langkah 6: Melakukan Branching pada Suatu Repositori","text":"

Pada tahap ini kamu akan mempelajari tentang penggunaan branch dalam Git. Penggunaan branch memungkinkan kamu untuk mengembangkan fitur atau memperbaiki bug di lingkungan terpisah sebelum menggabungkannya kembali ke branch utama.

Apa Itu Branch di Git?

Catatan:

"},{"location":"tutorial/tutorial-0/#tutorial-instalasi-django-dan-inisiasi-proyek-django","title":"Tutorial: Instalasi Django dan Inisiasi Proyek Django","text":"

Django adalah kerangka kerja (framework) yang populer untuk pengembangan aplikasi web dengan bahasa pemrograman Python. Dalam tutorial ini, kamu akan mempelajari langkah-langkah instalasi Django dan inisiasi proyek demo sebagai starter.

"},{"location":"tutorial/tutorial-0/#langkah-1-membuat-direktori-dan-mengaktifkan-virtual-environment","title":"Langkah 1: Membuat Direktori dan Mengaktifkan Virtual Environment","text":"
  1. Buat direktori baru dengan nama book-tracker dan masuk ke dalamnya.
  2. Di dalam direktori tersebut, buka command prompt (Windows) atau terminal shell (Unix).
  3. Buat virtual environment dengan menjalankan perintah berikut.

    python -m venv env\n
  4. Virtual environment ini berguna untuk mengisolasi package serta dependencies dari aplikasi agar tidak bertabrakan dengan versi lain yang ada pada komputermu. Kamu dapat mengaktifkan virtual environment dengan perintah berikut.

  5. Virtual environment akan aktif dan ditandai dengan (env) di baris input terminal.

"},{"location":"tutorial/tutorial-0/#langkah-2-menyiapkan-dependencies-dan-membuat-proyek-django","title":"Langkah 2: Menyiapkan Dependencies dan Membuat Proyek Django","text":"

Dependencies adalah komponen atau modul yang diperlukan oleh suatu perangkat lunak untuk berfungsi, termasuk library, framework, atau package. Hal tersebut memungkinkan pengembang memanfaatkan kode yang telah ada, mempercepat pengembangan, tetapi juga memerlukan manajemen yang hati-hati untuk memastikan kompatibilitas versi yang tepat. Penggunaan virtual environment membantu mengisolasi dependencies antara proyek-proyek yang berbeda.

  1. Di dalam direktori yang sama, buat berkas requirements.txt dan tambahkan beberapa dependencies.

    django\ngunicorn\nwhitenoise\npsycopg2-binary\nrequests\nurllib3\n
  2. Lakukan instalasi terhadap dependencies yang ada dengan perintah berikut. Jangan lupa jalankan virtual environment terlebih dahulu sebelum menjalankan perintah berikut.

    pip install -r requirements.txt\n
  3. Buat proyek Django bernama book_tracker dengan perintah berikut.

    django-admin startproject book_tracker .\n

    Pastikan karakter . tertulis di akhir perintah

"},{"location":"tutorial/tutorial-0/#langkah-3-konfigurasi-proyek-dan-menjalankan-server","title":"Langkah 3: Konfigurasi Proyek dan Menjalankan Server","text":"
  1. Tambahkan * pada ALLOWED_HOSTS di settings.py untuk keperluan deployment:

    ...\nALLOWED_HOSTS = [\"*\"]\n...\n

Dalam konteks deployment, ALLOWED_HOSTS berfungsi sebagai daftar host yang diizinkan untuk mengakses aplikasi web. Dengan menetapkan nilai [\"*\"], kamu mengizinkan akses dari semua host, yang akan memungkinkan aplikasi diakses secara luas. Namun, perlu diingat bahwa pengaturan ini harus digunakan dengan bijak dan hanya dalam situasi tertentu, seperti saat melakukan uji coba atau tahap awal pengembangan.

  1. Pastikan bahwa berkas manage.py ada pada direktori yang aktif pada terminal kamu saat ini. Jalankan server Django dengan perintah:

  2. Buka http://localhost:8000 pada peramban web untuk melihat animasi roket sebagai tanda aplikasi Django kamu berhasil dibuat.

"},{"location":"tutorial/tutorial-0/#langkah-4-menghentikan-server-dan-menonaktifkan-virtual-environment","title":"Langkah 4: Menghentikan Server dan Menonaktifkan Virtual Environment","text":"
  1. Untuk menghentikan server, tekan Ctrl+C (Windows/Linux) atau Control+C (Mac) pada terminal.
  2. Nonaktifkan virtual environment dengan perintah:

    deactivate\n

    Selamat! Kamu telah berhasil membuat aplikasi Django dari awal.

"},{"location":"tutorial/tutorial-0/#tutorial-unggah-proyek-ke-repositori-github","title":"Tutorial: Unggah Proyek ke Repositori GitHub","text":"
  1. Buatlah repositori GitHub baru bernama book-tracker dengan visibilitas public.

  2. Inisiasi direktori lokal book-tracker sebagai repositori Git.

    Hint: Ingat kembali tahap tutorial sebelumnya

  3. Tambahkan Berkas .gitignore

  4. Lakukan add, commit, dan push dari direktori repositori lokal.

Catatan:

"},{"location":"tutorial/tutorial-0/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu sudah menyelesaikan tutorial tentang penggunaan Git, GitHub, instalasi IDE, dan pengembangan proyek dengan Django.

Pesan tambahan, pastikan kamu memahami setiap kode yang kamu tulis, ya. Jangan sampai hanya asal copy-paste tanpa memahaminya terlebih dahulu. Apabila nanti kamu mengalami kesulitan, jangan ragu untuk bertanya ke asisten dosen ataupun teman. Semangat terus dalam menjalani perkuliahan PBP selama satu semester ke depan, dan jangan lupa untuk menikmati setiap prosesnya. Good luck!

"},{"location":"tutorial/tutorial-0/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-0/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-0/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-1/","title":"Tutorial 1: Pengenalan Aplikasi Django dan Model-View-Template (MVT) pada Django","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-1/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-1/#ringkasan-hasil-tutorial-0","title":"Ringkasan Hasil Tutorial 0","text":"

Untuk membantumu mengerjakan tutorial 1 dengan baik, kami mengharapkan hasil pengerjaan tutorial 0 sebagai berikut.

  1. Pada komputer lokal, terdapat direktori utama book-tracker yang telah diinisiasi sebagai repositori lokal.
  2. Pada direktori utama book-tracker tersebut, terdapat beberapa berkas dan subdirektori berikut.

  3. Subdirektori env.

  4. Subdirektori proyek book_tracker. Berbeda dengan direktori utama, subdirektori ini terbentuk setelah menjalankan perintah

    django-admin startproject book_tracker .\n
  5. Berkas .gitignore.

  6. Berkas manage.py.
  7. Berkas requirements.txt.
  8. (Opsional) Berkas db.sqlite3.

Struktur proyek book-tracker pada direktori lokal adalah sebagai berikut.

  1. Pada repositori GitHub, pastikan repositori book-tracker memiliki berkas dan direktori berikut.

  2. Direktori proyek book_tracker. Direktori ini hasil menjalankan perintah

    django-admin startproject book_tracker .\n
  3. Berkas .gitignore.

  4. Berkas manage.py.
  5. Berkas requirements.txt.

Struktur proyek book-tracker pada repositori GitHub adalah sebagai berikut.

"},{"location":"tutorial/tutorial-1/#pengenalan-mengenai-konsep-mvt","title":"Pengenalan Mengenai Konsep MVT","text":"

Dalam dunia pengembangan web, terdapat berbagai konsep dan arsitektur yang membantu dalam merancang dan mengembangkan aplikasi. Salah satu konsep yang umum digunakan adalah MVT (Model-View-Template).

"},{"location":"tutorial/tutorial-1/#apa-itu-konsep-mvt","title":"Apa Itu Konsep MVT?","text":"

MVT adalah singkatan dari Model-View-Template. MVT adalah sebuah konsep arsitektur yang digunakan dalam pengembangan web untuk memisahkan komponen-komponen utama dari sebuah aplikasi. Konsep ini memungkinkan pengembang web untuk mengorganisasi dan mengelola kode dengan lebih terstruktur.

"},{"location":"tutorial/tutorial-1/#apa-itu-model","title":"Apa Itu Model?","text":"

Model merupakan komponen dalam konsep MVT yang bertanggung jawab untuk mengatur dan mengelola data dari aplikasi. Model mewakili struktur data dan logika aplikasi yang berada di belakang tampilan. Model menghubungkan aplikasi dengan basis data dan mengatur interaksi dengan data tersebut.

"},{"location":"tutorial/tutorial-1/#apa-itu-view","title":"Apa Itu View?","text":"

View merupakan komponen yang menangani logika presentasi dalam konsep MVT. View mengontrol bagaimana data yang dikelola oleh model akan ditampilkan kepada pengguna. Dalam konteks MVT, view berperan sebagai pengatur tampilan dan mengambil data dari model untuk disajikan kepada pengguna.

"},{"location":"tutorial/tutorial-1/#apa-itu-template","title":"Apa Itu Template?","text":"

Template adalah komponen yang berfungsi untuk mengatur tampilan atau antarmuka pengguna. Template memisahkan kode HTML dari logika aplikasi. Dalam MVT, template digunakan untuk merancang tampilan yang akhirnya akan diisi dengan data dari model melalui view.

"},{"location":"tutorial/tutorial-1/#hubungan-antara-komponen-komponen-mvt","title":"Hubungan Antara Komponen-komponen MVT","text":"

Secara ringkas, konsep MVT berjalan dalam kerangka berikut:

"},{"location":"tutorial/tutorial-1/#manfaat-mvt","title":"Manfaat MVT","text":"

MVT memisahkan tugas antara logika aplikasi, tampilan, dan data, sehingga memungkinkan pengembang untuk bekerja pada setiap komponen secara terpisah.

Dengan pemisahan tugas yang jelas, kode menjadi lebih terorganisir dan mudah dikelola.

Kode dapat digunakan kembali dalam berbagai bagian aplikasi yang berbeda.

Struktur MVT mendukung skalabilitas dengan memungkinkan pengembangan paralel pada setiap komponen.

Catatan:

"},{"location":"tutorial/tutorial-1/#tutorial-membuat-aplikasi-django-beserta-konfigurasi-model","title":"Tutorial: Membuat Aplikasi Django beserta Konfigurasi Model","text":"

Dalam tutorial ini, akan dijelaskan mengenai konsep aplikasi dan proyek dalam Django.

Apa Itu Proyek dan Aplikasi dalam Django?

Sebelum dimulai, kamu perlu mengingat kembali bahwa direktori utama adalah direktori terluar, sedangkan direktori proyek adalah direktori di dalam direktori utama. Perlu diingat bahwa keduanya memiliki nama yang hampir sama. Direktori utama memiliki nama book-tracker, sementara itu direktori proyek memiliki nama book_tracker. Perbedaan hanya terletak pada penggunaan dash (-) dan underscore (_).

"},{"location":"tutorial/tutorial-1/#langkah-1-persiapan-awal","title":"Langkah 1: Persiapan Awal","text":"
  1. Buka direktori utama book-tracker.

  2. Sebelum memulai, pastikan kamu berada di direktori utama book-tracker yang telah dibuat pada tutorial sebelumnya.

  3. Di dalam direktori ini, kamu akan melanjutkan pengembangan proyek Django.

  4. Buka terminal atau command prompt dan pastikan direktori kerja kamu adalah direktori utama book-tracker.

  5. Aktifkan virtual environment yang telah dibuat sebelumnya. Jalankan perintah berikut sesuai dengan sistem operasi perangkat kamu.

  6. Windows:

    env\\Scripts\\activate.bat\n
  7. Unix (Linux & Mac OS):

    source env/bin/activate\n
"},{"location":"tutorial/tutorial-1/#langkah-2-membuat-aplikasi-main-dalam-proyek-book-tracker","title":"Langkah 2: Membuat Aplikasi main dalam Proyek Book Tracker","text":"

Kamu akan membuat aplikasi baru bernama main dalam proyek book tracker.

  1. Jalankan perintah berikut untuk membuat aplikasi baru.
python manage.py startapp main\n

Setelah perintah di atas dijalankan, akan terbentuk direktori baru dengan nama main yang akan berisi struktur awal untuk aplikasimu.

Mungkin kamu cukup bingung dengan istilah direktori utama, direktori proyek, atau direktori aplikasi. Akan tetapi, seiring berjalannya waktu, kamu pasti bisa!

  1. Daftarkan aplikasi main ke dalam proyek.

  2. Buka berkas settings.py di dalam direktori proyek book_tracker.

  3. Temukan variabel INSTALLED_APPS.
  4. Tambahkan 'main' ke dalam daftar aplikasi yang ada.

    INSTALLED_APPS = [\n    ...,\n    'main',\n    ...\n]\n

Dengan melakukan langkah-langkah tersebut, kamu telah mendaftarkan aplikasi main ke dalam proyek book tracker kamu sehingga proyekmu sudah mengenali bahwa terdapat aplikasi main yang dapat dijalankan.

"},{"location":"tutorial/tutorial-1/#tutorial-implementasi-template-dasar","title":"Tutorial: Implementasi Template Dasar","text":"

Kamu akan membuat template main.html di dalam direktori baru bernama templates pada aplikasi main. Template ini akan digunakan untuk menampilkan data book tracker kamu.

Saat ini, aplikasi book tracker belum menampilkan data apapun. Data akan ditampilkan pada tutorial selanjutnya.

"},{"location":"tutorial/tutorial-1/#langkah-1-membuat-dan-mengisi-berkas-mainhtml","title":"Langkah 1: Membuat dan Mengisi Berkas main.html","text":"

Sebelum mulai, mari pahami secara singkat mengenai HTML. HTML (Hypertext Markup Language) adalah penanda bahasa yang digunakan untuk membuat struktur dan tampilan konten pada halaman web.

Hint: Kamu akan mempelajari HTML lebih lanjut di tutorial 4.

  1. Buat direktori baru bernama templates di dalam direktori aplikasi main.

  2. Di dalam direktori templates, buat berkas baru bernama main.html dengan isi sebagai berikut. Gantilah nilai yang sesuai dengan data kamu.

<h1>Book Tracker Page</h1>\n\n<h5>Name:</h5>\n<p>Pak Bepe</p>\n<!-- Ubahlah sesuai dengan nama kamu -->\n<h5>Class:</h5>\n<p>PBP A</p>\n<!-- Ubahlah sesuai dengan kelas kamu -->\n
  1. Buka berkas HTML di web browser.

  2. Sebelum dihubungkan dengan aplikasi, cobalah membuka berkas main.html di web browser-mu.

  3. Perlu dicatat bahwa pada tahap ini hanya untuk memeriksa tampilan dasar HTML dan belum terhubung dengan Django.
  4. Berikut merupakan contoh tampilan HTML yang diharapkan.

"},{"location":"tutorial/tutorial-1/#tutorial-implementasi-model-dasar","title":"Tutorial: Implementasi Model Dasar","text":""},{"location":"tutorial/tutorial-1/#langkah-1-mengubah-berkas-modelspy-dalam-aplikasi-main","title":"Langkah 1: Mengubah Berkas models.py dalam Aplikasi main","text":"

Pada langkah ini, kamu akan mengubah berkas models.py yang terdapat di dalam direktori aplikasi main untuk mendefinisikan model baru.

  1. Buka berkas models.py pada direktori aplikasi main.

  2. Isi berkas models.py dengan kode berikut.

from django.db import models\n\nclass Book(models.Model):\n    name = models.CharField(max_length=255)\n    date_added = models.DateField(auto_now_add=True)\n    page = models.IntegerField()\n    description = models.TextField()\n

Penjelasan Kode:

"},{"location":"tutorial/tutorial-1/#langkah-2-membuat-dan-mengaplikasikan-migrasi-model","title":"Langkah 2: Membuat dan Mengaplikasikan Migrasi Model","text":"

Apa itu migrasi model?

Bagaimana cara melakukan migrasi model?

  1. Jalankan perintah berikut pada terminal atau command prompt di direktori utama untuk membuat migrasi model.
python manage.py makemigrations\n

makemigrations menciptakan berkas migrasi yang berisi perubahan model yang belum diaplikasikan ke dalam basis data.

  1. Masih di direktori utama, jalankan perintah berikut untuk menerapkan migrasi ke dalam basis data lokal.
python manage.py migrate\n

migrate mengaplikasikan perubahan model yang tercantum dalam berkas migrasi ke basis data.

Setiap kali kamu melakukan perubahan pada model, seperti menambahkan atau mengubah atribut, kamu perlu melakukan migrasi untuk merefleksikan perubahan tersebut.

"},{"location":"tutorial/tutorial-1/#tutorial-menghubungkan-view-dengan-template","title":"Tutorial: Menghubungkan View dengan Template","text":"

Dalam tutorial ini, kamu akan menghubungkan view dengan template menggunakan Django. Langkah-langkah ini akan menjelaskan bagaimana membuat fungsi view show_main dalam aplikasi main dan me-render template dengan data yang telah diambil dari model.

"},{"location":"tutorial/tutorial-1/#langkah-1-mengintegrasikan-komponen-mvt","title":"Langkah 1: Mengintegrasikan Komponen MVT","text":"

Kamu akan mengimpor modul yang diperlukan dan membuat fungsi view show_main.

  1. Buka berkas views.py yang terletak di dalam berkas aplikasi main.

  2. Tambahkan baris-baris impor berikut di bagian paling atas berkas apabila belum ada.

from django.shortcuts import render\n

Penjelasan Kode:

from django.shortcuts import render berguna untuk mengimpor fungsi render dari modul django.shortcuts. Fungsi render digunakan untuk me-render tampilan HTML dengan menggunakan data yang diberikan.

  1. Tambahkan fungsi show_main di bawah impor:
def show_main(request):\n    context = {\n        'name': 'Pak Bepe',\n        'class': 'PBP A'\n    }\n\n    return render(request, \"main.html\", context)\n

Penjelasan Kode:

"},{"location":"tutorial/tutorial-1/#langkah-2-modifikasi-template","title":"Langkah 2: Modifikasi Template","text":"

Sekarang, kamu akan mengubah template main.html agar dapat menampilkan data yang telah diambil dari model.

  1. Buka berkas main.html yang telah dibuat sebelumnya dalam direktori templates pada direktori main.

  2. Ubah nama dan kelas yang sebelumnya dibuat secara statis menjadi kode Django yang sesuai untuk menampilkan data.

...\n<h5>Name:</h5>\n<p>{{ name }}</p>\n<p></p>\n<h5>Class:</h5>\n<p>{{ class }}</p>\n

Penjelasan Kode:

Sintaks Django {{ name }} dan {{ class }} digunakan untuk menampilkan nilai dari variabel yang telah didefinisikan dalam context.

"},{"location":"tutorial/tutorial-1/#tutorial-mengonfigurasi-routing-url","title":"Tutorial: Mengonfigurasi Routing URL","text":"

Kamu akan mengatur routing URL agar aplikasi main dapat diakses melalui web browser.

"},{"location":"tutorial/tutorial-1/#langkah-1-mengonfigurasi-routing-url-aplikasi-main","title":"Langkah 1: Mengonfigurasi Routing URL Aplikasi main","text":"
  1. Buatlah berkas baru bernamaurls.py di dalam direktori main.
  2. Isi urls.py dengan kode berikut.
from django.urls import path\nfrom main.views import show_main\n\napp_name = 'main'\n\nurlpatterns = [\n    path('', show_main, name='show_main'),\n]\n

Penjelasan Kode dalam urls.py pada Aplikasi main:

"},{"location":"tutorial/tutorial-1/#langkah-2-mengonfigurasi-routing-url-proyek","title":"Langkah 2: Mengonfigurasi Routing URL Proyek","text":"

Kamu akan menambahkan rute URL dalam urls.py pada proyek untuk menghubungkannya ke tampilan main.

  1. Buka berkas urls.py di dalam direktori proyek book_tracker, bukan yang ada di dalam direktori aplikasi main.
  2. Impor fungsi include dari django.urls.
...\nfrom django.urls import path, include\n...\n
  1. Tambahkan rute URL seperti berikut untuk mengarahkan ke tampilan main di dalam variabel urlpatterns.
urlpatterns = [\n    ...\n    path('', include('main.urls')),\n    ...\n]\n

Penjelasan:

Sebagai bayangan, apabila kamu menggunakan path 'main/' pada contoh di atas, maka kamu perlu mengakses halaman http://localhost:8000/main/ untuk mengakses halaman aplikasi main. Karena path yang ditentukan adalah '', maka kamu dapat mengakses aplikasi main melalui URL http://localhost:8000/ saja.

  1. Jalankan proyek Django dengan menjalankan perintah python manage.py runserver pada terminal atau command prompt di direktori utama.

  2. Bukalah http://localhost:8000/ di web browser favoritmu untuk melihat halaman yang sudah kamu buat.

Dengan langkah-langkah di atas, kamu telah berhasil mengimplementasikan tampilan dasar dalam aplikasi main dan menghubungkannya dengan rute URL proyek. Pastikan kamu memahami setiap langkah dan informasi yang diberikan untuk mengaktifkan tampilan dalam proyek Django-mu

"},{"location":"tutorial/tutorial-1/#apa-bedanya-urlspy-pada-aplikasi-dan-urlspy-pada-proyek","title":"Apa bedanya urls.py pada aplikasi dan urls.py pada proyek?","text":""},{"location":"tutorial/tutorial-1/#tutorial-pengenalan-django-unit-testing","title":"Tutorial: Pengenalan Django Unit Testing","text":"

Unit testing dapat digunakan untuk mengecek apakah kode yang dibuat bekerja sesuai dengan keinginan. Hal ini juga berguna ketika kamu melakukan perubahan kode. Dengan menggunakan tes, kamu bisa mengecek apakah perubahan yang dilakukan dapat menyebabkan perilaku yang tidak diinginkan pada aplikasi.

"},{"location":"tutorial/tutorial-1/#langkah-1-membuat-unit-test","title":"Langkah 1: Membuat Unit Test","text":"
  1. Bukalah berkas tests.py pada direktori aplikasi main.
  2. Isi tests.py dengan kode berikut.
from django.test import TestCase, Client\n\nclass mainTest(TestCase):\n    def test_main_url_is_exist(self):\n        response = Client().get('')\n        self.assertEqual(response.status_code, 200)\n\n    def test_main_using_main_template(self):\n        response = Client().get('')\n        self.assertTemplateUsed(response, 'main.html')\n

Penjelasan:

"},{"location":"tutorial/tutorial-1/#langkah-2-menjalankan-test","title":"Langkah 2: Menjalankan Test","text":"
  1. Jalankan tes dengan menggunakan perintah berikut.
python manage.py test\n
  1. Jika tes berhasil, akan mengeluarkan informasi berikut.
Found 2 test(s).\n Creating test database for alias 'default'...\n System check identified no issues (0 silenced).\n ..\n ----------------------------------------------------------------------\n Ran 2 tests in 0.006s\n\n OK\n Destroying test database for alias 'default'...\n

Selamat! Kamu telah berhasil menulis Django Test dan menjalankannya.

"},{"location":"tutorial/tutorial-1/#penutup","title":"Penutup","text":"
  1. Pada akhir tutorial ini, struktur direktori lokalmu akan terlihat seperti ini.

Huruf U menandakan bahwa terdapat berkas baru yang belum dilacak oleh Git. Huruf M menandakan bahwa terdapat berkas yang telah dilacak sebelumnya yang dimodifikasi.

  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.
  2. Jalankan perintah berikut untuk melakukan add, commit dan push.
git add .\ngit commit -m \"<pesan_commit>\"\ngit push origin <branch_utama>\n

"},{"location":"tutorial/tutorial-1/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-1/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-1/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023/2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-2/","title":"Tutorial 2: Form dan Data Delivery","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-2/#tujuan-pembelajaran","title":"Tujuan Pembelajaran\u200b","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-2/#pengenalan-data-delivery","title":"Pengenalan Data Delivery","text":"

Dalam mengembangkan suatu platform, ada kalanya kita perlu mengirimkan data dari satu stack ke stack lainnya. Data yang dikirimkan bisa bermacam-macam bentuknya. Beberapa contoh format data yang umum digunakan antara lain HTML, XML, dan JSON. Implementasi data delivery dalam bentuk HTML sudah kamu pelajari pada tutorial sebelumnya. Pada tutorial ini akan diajarkan terkait XML dan JSON.

"},{"location":"tutorial/tutorial-2/#xml-extensible-markup-language","title":"XML (Extensible Markup Language)","text":"

XML adalah singkatan dari eXtensible Markup Language. XML didesain menjadi self-descriptive, jadi dengan membaca XML tersebut kita bisa mengerti informasi apa yang ingin disampaikan dari data yang tertulis. XML digunakan pada banyak aplikasi web maupun mobile, yaitu untuk menyimpan dan mengirimkan data. XML hanya berisi informasi yang dibungkus di dalam tag. Kita perlu menulis program untuk mengirim, menerima, menyimpan, atau menampilkan informasi tersebut.

Contoh Format XML:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<person>\n    <name>Alice Johnson</name>\n    <age>25</age>\n    <address>\n        <street>123 Main St</street>\n        <city>Los Angeles</city>\n        <zip>90001</zip>\n    </address>\n</person>\n

XML di atas sangatlah self-descriptive:

Dokumen XML membentuk struktur seperti tree yang dimulai dari root, lalu branch, hingga berakhir pada leaves. Dokumen XML harus mengandung sebuah root element yang merupakan parent dari elemen lainnya. Pada contoh di atas, <person> adalah root element.

Baris <?xml version=\"1.0\" encoding=\"UTF-8\"?> biasanya disebut sebagai XML Prolog. XML Prolog bersifat opsional, akan tetapi jika ada maka posisinya harus berada di awal dokumen XML. Pada dokumen XML, semua elemen wajib memiliki closing tag. Tag pada XML sifatnya case sensitive, sehingga tag <person> dianggap berbeda dengan tag <Person>.

"},{"location":"tutorial/tutorial-2/#json-javascript-object-notation","title":"JSON (JavaScript Object Notation)","text":"

JSON adalah singkatan dari JavaScript Object Notation. JSON didesain menjadi self-describing, sehingga JSON sangat mudah untuk dimengerti. JSON digunakan pada banyak aplikasi web maupun mobile, yaitu untuk menyimpan dan mengirimkan data. Sintaks JSON merupakan turunan dari Object JavaScript. Akan tetapi format JSON berbentuk text, sehingga kode untuk membaca dan membuat JSON banyak terdapat dibanyak bahasa pemrograman.

Contoh format JSON:

{\n  \"name\": \"Alice Johnson\",\n  \"age\": 25,\n  \"address\": {\n    \"street\": \"123 Main St\",\n    \"city\": \"Los Angeles\",\n    \"zip\": \"90001\"\n  }\n}\n

Data pada JSON disimpan dalam bentuk key dan value. Pada contoh di atas yang menjadi key adalah name, age, dan address. Value dapat berupa tipe data primitif (string, number, boolean) ataupun berupa objek.

"},{"location":"tutorial/tutorial-2/#pre-tutorial-notes","title":"Pre-Tutorial Notes","text":"

Sebelum kamu memulai, serta untuk membantumu mengikuti tutorial 2 dengan baik, kami mengharapkan beberapa hasil berikut dari tutorial 1:

"},{"location":"tutorial/tutorial-2/#tutorial-implementasi-skeleton-sebagai-kerangka-views","title":"Tutorial: Implementasi Skeleton sebagai Kerangka Views","text":"

Sebelum kita membuat form registrasi, kita perlu membuat suatu skeleton yang berfungsi sebagai kerangka views dari situs web kita. Dengan kerangka views ini, kita dapat memastikan adanya konsistensi dalam desain situs web kita serta memperkecil kemungkinan terjadinya redundansi kode. Pada tutorial ini, kita akan membuat skeleton untuk situs web yang akan kita buat pada tutorial selanjutnya.

  1. Buat folder templates pada root folder (direktori utama) dan buatlah sebuah berkas HTML baru bernama base.html. Berkas base.html berfungsi sebagai template dasar yang dapat digunakan sebagai kerangka umum untuk halaman web lainnya di dalam proyek. Isilah berkas base.html tersebut dengan kode berikut:
{% load static %}\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    {% block meta %} {% endblock meta %}\n  </head>\n\n  <body>\n    {% block content %} {% endblock content %}\n  </body>\n</html>\n

Baris-baris yang dikurung dalam {% ... %} disebut dengan template tags Django. Baris-baris inilah yang akan berfungsi untuk memuat data secara dinamis dari Django ke HTML.

  1. Buka settings.py yang ada pada direktori proyek (book_tracker) dan carilah baris yang mengandung variabel TEMPLATES. Sesuaikan kode yang ada dengan potongan kode berikut agar berkas base.html terdeteksi sebagai berkas template.
...\nTEMPLATES = [\n    {\n        'BACKEND': 'django.template.backends.django.DjangoTemplates',\n        'DIRS': [BASE_DIR / 'templates'], # Tambahkan konten baris ini\n        'APP_DIRS': True,\n        ...\n    }\n]\n...\n
  1. Pada subdirektori templates yang ada pada direktori main (main/templates/), ubahlah kode berkas main.html yang telah dibuat di tutorial sebelumnya menjadi sebagai berikut.
{% extends 'base.html' %} {% block content %}\n<h1>Book Tracker Page</h1>\n\n<h5>Name:</h5>\n<p>{{name}}</p>\n\n<h5>Class:</h5>\n<p>{{class}}</p>\n{% endblock content %}\n

Perhatikan bahwa kode diatas merupakan kode yang sama dengan kode pada main.html pada tutorial sebelumnya. Perbedaannya adalah pada kode diatas, kita menggunakan base.html sebagai template utama.

"},{"location":"tutorial/tutorial-2/#tutorial-membuat-form-input-data-dan-menampilkan-data-buku-pada-html","title":"Tutorial: Membuat Form Input Data dan Menampilkan Data Buku Pada HTML","text":"

Sampai saat ini, belum ada data yang ditambahkan dan dimunculkan ke dalam aplikasi. Sekarang, kita akan membuat sebuah form sederhana untuk menginput data buku pada aplikasi sehingga nantinya kamu dapat menambahkan data baru untuk ditampilkan pada halaman utama.

  1. Buat berkas baru pada direktori main dengan nama forms.py untuk membuat struktur form yang dapat menerima data buku baru. Tambahkan kode berikut ke dalam berkas forms.py.
from django.forms import ModelForm\nfrom main.models import Book\n\nclass BookForm(ModelForm):\n    class Meta:\n        model = Book\n        fields = [\"name\", \"page\", \"description\"]\n

Penjelasan Kode:

from django.shortcuts import render, redirect   # Tambahkan import redirect di baris ini\nfrom main.forms import BookForm\nfrom main.models import Book\n
  1. Masih di berkas yang sama, buat fungsi baru dengan nama create_book yang menerima parameter request. Tambahkan potongan kode di bawah ini untuk menghasilkan formulir yang dapat menambahkan data buku secara otomatis ketika data di-submit dari form.
def create_book(request):\n    form = BookForm(request.POST or None)\n\n    if form.is_valid() and request.method == \"POST\":\n        form.save()\n        return redirect('main:show_main')\n\n    context = {'form': form}\n    return render(request, \"create_book.html\", context)\n

Penjelasan Kode:

def show_main(request):\n    books = Book.objects.all()\n\n    context = {\n        'name': 'Pak Bepe',\n        'class': 'PBP A',\n        'books': books\n    }\n\n    return render(request, \"main.html\", context)\n

Penjelasan Kode:

Fungsi Book.objects.all() digunakan untuk mengambil seluruh objek Book yang tersimpan pada database.

  1. Buka urls.py yang ada pada direktori main dan import fungsi create_book yang sudah kamu buat tadi.
from main.views import show_main, create_book\n
  1. Tambahkan path URL ke dalam variabel urlpatterns pada urls.py di main untuk mengakses fungsi yang sudah di-import pada poin sebelumnya.
urlpatterns = [\n   ...\n   path('create-book', create_book, name='create_book'),\n]\n
  1. Buat berkas HTML baru dengan nama create_book.html pada direktori main/templates. Isi create_book.html dengan kode berikut.
{% extends 'base.html' %} {% block content %}\n<h1>Add New Book</h1>\n\n<form method=\"POST\">\n  {% csrf_token %}\n  <table>\n    {{ form.as_table }}\n    <tr>\n      <td></td>\n      <td>\n        <input type=\"submit\" value=\"Add Book\" />\n      </td>\n    </tr>\n  </table>\n</form>\n\n{% endblock %}\n

Penjelasan Kode:

...\n<table>\n  <tr>\n    <th>Name</th>\n    <th>Page</th>\n    <th>Description</th>\n    <th>Date Added</th>\n  </tr>\n\n  {% comment %} Berikut cara memperlihatkan data produk di bawah baris ini\n  {%endcomment %} {% for book in books %}\n  <tr>\n    <td>{{book.name}}</td>\n    <td>{{book.page}}</td>\n    <td>{{book.description}}</td>\n    <td>{{book.date_added}}</td>\n  </tr>\n  {% endfor %}\n</table>\n\n<br />\n\n<a href=\"{% url 'main:create_book' %}\">\n  <button>Add New Book</button>\n</a>\n{% endblock content %}\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu. Coba tambahkan beberapa data produk baru dan seharusnya kamu dapat melihat data yang ditambahkan pada halaman utama aplikasi.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-dalam-bentuk-xml","title":"Tutorial Mengembalikan Data dalam Bentuk XML","text":"
  1. Buka views.py yang ada pada folder main dan tambahkan import HttpResponse dan Serializer pada bagian paling atas.
from django.http import HttpResponse\nfrom django.core import serializers\n
  1. Buatlah sebuah fungsi baru yang menerima parameter request dengan nama show_xml dan buatlah sebuah variabel di dalam fungsi tersebut yang menyimpan hasil query dari seluruh data yang ada pada Book.
def show_xml(request):\n    data = Book.objects.all()\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi XML dan parameter content_type=\"application/xml\".
def show_xml(request):\n    data = Book.objects.all()\n    return HttpResponse(serializers.serialize(\"xml\", data), content_type=\"application/xml\")\n

Penjelasan Kode:

serializers digunakan untuk translate objek model menjadi format lain seperti dalam fungsi ini adalah XML.

  1. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.
from main.views import show_main, create_book, show_xml\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('xml/', show_xml, name='show_xml'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/xml/ di browser favoritmu untuk melihat hasilnya.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-dalam-bentuk-json","title":"Tutorial: Mengembalikan Data dalam Bentuk JSON","text":"
  1. Buka views.py yang ada pada folder main dan buatlah sebuah fungsi baru yang menerima parameter request dengan nama show_json dengan sebuah variabel di dalamnya yang menyimpan hasil query dari seluruh data yang ada pada Book.
def show_json(request):\n    data = Book.objects.all()\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON dan parameter content_type=\"application/json\".
def show_json(request):\n    data = Book.objects.all()\n    return HttpResponse(serializers.serialize(\"json\", data), content_type=\"application/json\")\n
  1. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.
from main.views import show_main, create_book, show_xml, show_json\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('json/', show_json, name='show_json'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/json/ (sesuaikan dengan path url yang dibuat) di browser favoritmu untuk melihat hasilnya.
"},{"location":"tutorial/tutorial-2/#tutorial-mengembalikan-data-berdasarkan-id-dalam-bentuk-xml-dan-json","title":"Tutorial: Mengembalikan Data Berdasarkan ID dalam Bentuk XML dan JSON","text":"
  1. Buka views.py yang ada pada folder main dan buatlah dua fungsi baru yang menerima parameter _request_ dan id dengan nama show_xml_by_id dan show_json_by_id.

  2. Buatlah sebuah variabel di dalam fungsi tersebut yang menyimpan hasil query dari data dengan id tertentu yang ada pada Book.

data = Book.objects.filter(pk=id)\n
  1. Tambahkan return function berupa HttpResponse yang berisi parameter data hasil query yang sudah diserialisasi menjadi JSON atau XML dan parameter content_type dengan value \"application/xml\" (untuk format XML) atau \"application/json\" (untuk format JSON).

  2. XML

    def show_xml_by_id(request, id):\n    data = Book.objects.filter(pk=id)\n    return HttpResponse(serializers.serialize(\"xml\", data), content_type=\"application/xml\")\n
  3. JSON

    def show_json_by_id(request, id):\n    data = Book.objects.filter(pk=id)\n    return HttpResponse(serializers.serialize(\"json\", data), content_type=\"application/json\")\n
  4. Buka urls.py yang ada pada folder main dan import fungsi yang sudah kamu buat tadi.

from main.views import show_main, create_book, show_xml, show_json, show_xml_by_id, show_json_by_id\n
  1. Tambahkan path URL ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
...\npath('xml/<int:id>/', show_xml_by_id, name='show_xml_by_id'),\npath('json/<int:id>/', show_json_by_id, name='show_json_by_id'),\n...\n
  1. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/xml/[id]/ atau http://localhost:8000/json/[id]/ di browser favoritmu untuk melihat hasilnya.

Catatan: Sesuaikan [id] pada URL di atas dengan id objek yang ingin dilihat.

"},{"location":"tutorial/tutorial-2/#tutorial-penggunaan-postman-sebagai-data-viewer","title":"Tutorial: Penggunaan Postman Sebagai Data Viewer","text":"
  1. Pastikan server kamu sudah berjalan dengan perintah python manage.py runserver.

  2. Buka Postman dan buatlah sebuah request baru dengan method GET dan url http://localhost:8000/xml/ atau http://localhost:8000/json/ untuk mengetes apakah data terkirimkan dengan baik.

Panduan Instalasi Postman dapat dilihat pada Laman Resmi Postman.

Contoh:

  1. Klik tombol Send untuk mengirimkan request tersebut.

  2. Kamu akan melihat hasil response dari request tersebut pada bagian bawah Postman.

  1. Kamu juga dapat mengubah url menjadi http://localhost:8000/xml/[id] atau http://localhost:8000/json/[id] untuk mengetes fungsi pengambilan data produk berdasarkan ID.

"},{"location":"tutorial/tutorial-2/#penutup","title":"Penutup","text":"
  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.
  1. Pada akhir tutorial ini, struktur direktori lokalmu akan terlihat seperti ini.
  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjutnya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  2. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-2/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-2/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-2/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-3/","title":"Tutorial 3: Autentikasi, Session, dan Cookies","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-3/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, kamu diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-3/#pengenalan-http","title":"Pengenalan HTTP","text":"

HTTP (HyperText Transfer Protocol) adalah protokol yang digunakan untuk berkomunikasi antara client dan server. HTTP bersifat stateless yang berarti setiap transaksi/aktivitas yang dilakukan dianggap sebagai transaksi/aktivitas yang benar-benar baru, sehingga tidak ada data sebelumnya yang disimpan untuk transaksi/aktivitas saat ini.

Beberapa konsep dasar mengenai HTTP:

  1. Client/Server: Interaksi dilakukan antar client/server. Klien adalah pihak yang melakukan request dan server adalah pihak yang memberikan response.

  2. Stateless: Setiap aktivitas (request/response) bersifat independen, tidak tersimpan pada aktivitas terdahulu.

  3. OSI Layer/Model: Model Open Systems Interconnection (OSI) menjelaskan 7 lapisan yang digunakan sistem komputer untuk berkomunikasi melalui jaringan. Model 7-layer OSI terdiri dari Application Layer, Presentation Layer, Session Layer, Transport Layer, Network Layer, Data Link Layer, dan Physical Layer.

  4. Application Layer: Pada OSI Model yang disinggung di atas, website berjalan pada application layer. Sedangkan, proses request/response terjadi pada transport Layer yang umumnya menggunakan protokol TCP yang menentukan bagaimana data akan dikirim. Application Layer tidak peduli apa yang dilakukan oleh transport Layer (bagaimana data dikirim, diolah, dsb) karena application layer hanya berfokus kepada request dan response.

Lapisan OSI lainnya akan diajarkan pada mata kuliah Jaringan Komputer/Jaringan Komunikasi Data. Kamu dapat mencarinya sendiri jika kamu penasaran. \ud83d\ude09

  1. Client Actions Method: Terdapat metode-metode yang digunakan oleh client saat melakukan request. Contoh: GET, POST, PUT, DELETE, dll. Penjelasan lebih detail dapat dibaca di sini.

  2. Server Status Code: Merupakan status kode yang diberikan oleh server terhadap suatu request pada sebuah halaman web. Contoh: 200 (OK), 404 (Page Not Found), 500 (Internal Server Error), dsb. Penjelasan lebih detail dapat dibaca di sini.

  3. Headers: Merupakan informasi kecil yang dikirim bersamaan dengan request dan response. Informasi-informasi tersebut berguna sebagai data tambahan yang digunakan untuk memproses request/response. Contoh: Pada headers, terdapat content-type:json. Artinya, tipe konten yang diminta/dikirim adalah json. Headers juga menyimpan data cookies.

"},{"location":"tutorial/tutorial-3/#pengenalan-cookies-session","title":"Pengenalan Cookies & Session","text":"

Semua komunikasi antara klien dan server dilakukan melalui protokol HTTP, di mana HTTP merupakan stateless protocol. Artinya state yang satu dengan yang lain tidak berhubungan (independen). Hal ini mengharuskan komputer klien yang menjalankan browser untuk membuat koneksi TCP ke server setiap kali melakukan request.

Tanpa adanya koneksi persisten antara klien dan server, software pada setiap sisi (endpoint) tidak dapat bergantung hanya pada koneksi TCP untuk melakukan holding state atau holding session state.

"},{"location":"tutorial/tutorial-3/#apa-yang-dimaksud-dengan-holding-state","title":"Apa yang dimaksud dengan holding state?","text":"

Sebagai contoh, kamu ingin mengakses suatu halaman A pada suatu web yang mensyaratkan pengaksesnya sudah login ke dalam web. Kemudian kamu login ke web tersebut dan berhasil membuka halaman A. Saat ingin pindah ke halaman B pada web yang sama, tanpa adanya suatu proses holding state maka kamu akan diminta untuk login kembali. Begitu yang akan terjadi setiap kali kamu mengakses halaman yang berbeda padahal masih pada web yang sama.

Proses memberitahu \"siapa\" yang sedang login dan menyimpan data ini dikenal sebagai bentuk dialog antara klien-server dan merupakan dasar session - a semi-permanent exchange of information. Merupakan hal yang sulit untuk membuat HTTP melakukan holding state (karena HTTP merupakan stateless protocol). Oleh karena itu, dibutuhkan teknik untuk mengatasi masalah tersebut, yaitu Cookie dan Session.

"},{"location":"tutorial/tutorial-3/#cara-melakukan-holding-state","title":"Cara melakukan holding state?","text":"

Salah satu cara yang paling banyak digunakan untuk melakukan holding state adalah dengan menggunakan session ID yang disimpan sebagai cookie pada komputer klien. Session ID dapat dianggap sebagai suatu token (barisan karakter) untuk mengenali session yang unik pada aplikasi web tertentu. Daripada menyimpan semua jenis informasi sebagai cookies pada klien seperti username, nama, dan password, hanya Session ID yang disimpan.

Session ID ini kemudian dapat dipetakan ke suatu struktur data pada sisi web server. Pada struktur data tersebut, kamu dapat menyimpan semua informasi yang kamu butuhkan. Pendekatan ini jauh lebih aman untuk menyimpan informasi mengenai pengguna, daripada menyimpannya pada cookie. Dengan cara ini, informasi tidak dapat disalahgunakan oleh klien atau koneksi yang mencurigakan.

Selain itu, pendekatan ini lebih \"tepat\" jika data yang akan disimpan ada banyak. Hal itu karena cookie hanya dapat menyimpan maksimal 4 KB data. Bayangkan kamu sudah login ke suatu web/aplikasi dan mendapat session ID (session identifier). Untuk dapat melakukan holding state pada HTTP yang stateless, browser biasanya mengirimkan suatu session ID ke server pada setiap request. Dengan begitu, setiap kali datang suatu request, maka server akan bereaksi (kurang lebih) \"Oh, ini orang yang tepat!\". Kemudian server akan mencari informasi state di memori server atau di database berdasarkan session ID yang didapat, lalu mengembalikan data yang diminta.

Perbedaan penting yang perlu diingat adalah data cookie disimpan pada sisi klien, sedangkan data session biasanya disimpan pada sisi server. Untuk pembahasan lebih detail mengenai stateless, stateful, cookie, dan session dapat dibaca di sini.

Berikut tabel singkat yang menjelaskan perbedaan antara cookies, session, dan local storage secara singkat.

Cookies Local Storage Sessions Kapasitas 4 KB 5 MB 5 MB Teknologi Browser HTML4/HTML5 HTML5 HTML5 Aksesibilitas Semua window Semua window Tab yang sama Kedaluwarsa Diatur manual Selamanya Saat tab ditutup

Beberapa tautan video yang dapat memperkaya pengetahuan terkait materi ini:

"},{"location":"tutorial/tutorial-3/#pre-tutorial-notes","title":"Pre-Tutorial Notes","text":"

Sebelum kamu memulai, serta untuk membantumu mengikuti tutorial 3 dengan baik, kami mengharapkan beberapa hasil berikut dari tutorial 2:

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-dan-form-registrasi","title":"Tutorial: Membuat Fungsi dan Form Registrasi","text":"

Pada tutorial sebelumnya, kita sudah mencoba membuat sebuah form untuk menambahkan suatu buku. Bagaimana? Mudah kan? Pada tutorial ini kita akan membuat halaman utama (main) menjadi restricted dengan cara membuat akun untuk pengguna. Sehingga, pengguna yang ingin mengakses halaman utama main harus melakukan login terlebih dahulu agar mendapatkan akses.

  1. Aktifkan virtual environment terlebih dahulu pada terminal. (Hint: Ingat tutorial 0!)

  2. Buka views.py yang ada pada subdirektori main pada proyek kamu. Tambahkan import redirect, UserCreationForm, dan messages pada bagian paling atas.

from django.shortcuts import redirect\nfrom django.contrib.auth.forms import UserCreationForm\nfrom django.contrib import messages\n

Penjelasan Kode:

UserCreationForm adalah impor formulir bawaan yang memudahkan pembuatan formulir pendaftaran pengguna dalam aplikasi web. Dengan formulir ini, pengguna baru dapat mendaftar dengan mudah di situs web Anda tanpa harus menulis kode dari awal.

  1. Tambahkan fungsi register di bawah ini ke dalam views.py. Fungsi ini berfungsi untuk menghasilkan formulir registrasi secara otomatis dan menghasilkan akun pengguna ketika data di-submit dari form.
def register(request):\n    form = UserCreationForm()\n\n    if request.method == \"POST\":\n        form = UserCreationForm(request.POST)\n        if form.is_valid():\n            form.save()\n            messages.success(request, 'Your account has been successfully created!')\n            return redirect('main:login')\n    context = {'form':form}\n    return render(request, 'register.html', context)\n

Penjelasan Kode:

{% extends 'base.html' %} \n\n{% block meta %}\n<title>Register</title>\n{% endblock meta %} \n\n{% block content %}\n\n<div class=\"login\">\n  <h1>Register</h1>\n\n  <form method=\"POST\">\n    {% csrf_token %}\n    <table>\n      {{ form.as_table }}\n      <tr>\n        <td></td>\n        <td><input type=\"submit\" name=\"submit\" value=\"Daftar\" /></td>\n      </tr>\n    </table>\n  </form>\n\n  {% if messages %}\n  <ul>\n    {% for message in messages %}\n    <li>{{ message }}</li>\n    {% endfor %}\n  </ul>\n  {% endif %}\n</div>\n\n{% endblock content %}\n
  1. Buka urls.py yang ada pada subdirektori main dan impor fungsi yang sudah kamu buat tadi.
from main.views import register\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
 urlpatterns = [\n     ...\n     path('register/', register, name='register'),\n ]\n

Kita sudah menambahkan formulir registrasi akun dan membuat mekanisme register. Selanjutnya, kita akan membuat form login agar pengguna dapat melakukan autentikasi akun.

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-login","title":"Tutorial: Membuat Fungsi Login","text":"
  1. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import authenticate dan login pada bagian paling atas.
from django.contrib.auth import authenticate, login\n

Penjelasan Kode:

Singkatnya, fungsi authenticate dan login yang diimport diatas adalah fungsi bawaan Django yang dapat digunakan untuk melakukan autentikasi dan login (jika autentikasi berhasil). Selengkapnya dapat dibaca di sini.

  1. Tambahkan fungsi login_user di bawah ini ke dalam views.py. Fungsi ini berfungsi untuk mengautentikasi pengguna yang ingin login.
def login_user(request):\n    if request.method == 'POST':\n        username = request.POST.get('username')\n        password = request.POST.get('password')\n        user = authenticate(request, username=username, password=password)\n        if user is not None:\n            login(request, user)\n            return redirect('main:show_main')\n        else:\n            messages.info(request, 'Sorry, incorrect username or password. Please try again.')\n    context = {}\n    return render(request, 'login.html', context)\n

Penjelasan Kode:

authenticate(request, username=username, password=password) digunakan untuk melakukan autentikasi pengguna berdasarkan username dan password yang diterima dari permintaan (request) yang dikirim oleh pengguna saat login.

  1. Buatlah berkas HTML baru dengan nama login.html pada direktori main/templates. Isi dari login.html dapat kamu isi dengan template berikut.
{% extends 'base.html' %}\n\n{% block meta %}\n<title>Login</title>\n{% endblock meta %} \n\n{% block content %}\n<div class=\"login\">\n  <h1>Login</h1>\n\n  <form method=\"POST\" action=\"\">\n    {% csrf_token %}\n    <table>\n      <tr>\n        <td>Username:</td>\n        <td>\n          <input\n            type=\"text\"\n            name=\"username\"\n            placeholder=\"Username\"\n            class=\"form-control\"\n          />\n        </td>\n      </tr>\n\n      <tr>\n        <td>Password:</td>\n        <td>\n          <input\n            type=\"password\"\n            name=\"password\"\n            placeholder=\"Password\"\n            class=\"form-control\"\n          />\n        </td>\n      </tr>\n\n      <tr>\n        <td></td>\n        <td><input class=\"btn login_btn\" type=\"submit\" value=\"Login\" /></td>\n      </tr>\n    </table>\n  </form>\n\n  {% if messages %}\n  <ul>\n    {% for message in messages %}\n    <li>{{ message }}</li>\n    {% endfor %}\n  </ul>\n  {% endif %} Don't have an account yet?\n  <a href=\"{% url 'main:register' %}\">Register Now</a>\n</div>\n\n{% endblock content %}\n
  1. Buka urls.py yang ada pada subdirektori main dan import fungsi yang sudah kamu buat tadi.
from main.views import login_user\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
urlpatterns = [\n   ...\n   path('login/', login_user, name='login'),\n]\n

Kita sudah menambahkan form login akun dan membuat mekanisme login. Selanjutnya, kita akan membuat mekanisme logout dan menambahkan tombol logout pada halaman main.

"},{"location":"tutorial/tutorial-3/#tutorial-membuat-fungsi-logout","title":"Tutorial: Membuat Fungsi Logout","text":"
  1. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import logout ini pada bagian paling atas.
from django.contrib.auth import logout\n
  1. Tambahkan fungsi di bawah ini ke dalam fungsi views.py. Fungsi ini berfungsi untuk melakukan mekanisme logout.
def logout_user(request):\n    logout(request)\n    return redirect('main:login')\n

Penjelasan Kode:

...\n<a href=\"{% url 'main:logout' %}\">\n  <button>Logout</button>\n</a>\n...\n
  1. Buka urls.py yang ada pada subdirektori main dan import fungsi yang sudah kamu buat tadi.
from main.views import logout_user\n
  1. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.
urlpatterns = [\n   ...\n   path('logout/', logout_user, name='logout'),\n]\n

Kita sudah membuat mekanisme logout dan menyelesaikan sistem autentikasi dalam proyek ini.

"},{"location":"tutorial/tutorial-3/#tutorial-merestriksi-akses-halaman-main","title":"Tutorial: Merestriksi Akses Halaman Main","text":"
  1. Buka kembali views.py yang ada pada subdirektori main dan tambahkan import login_required pada bagian paling atas.
from django.contrib.auth.decorators import login_required\n

Penjelasan Kode: Kode from django.contrib.auth.decorators import login_required digunakan untuk mengimpor sebuah decorator yang bisa mengharuskan pengguna masuk (login) terlebih dahulu sebelum dapat mengakses suatu halaman web.

  1. Tambahkan potongan kode @login_required(login_url='/login') di atas fungsi show_main agar halaman main hanya dapat diakses oleh pengguna yang sudah login (terautentikasi).
...\n@login_required(login_url='/login')\ndef show_main(request):\n...\n

Setelah melakukan restriksi akses halaman main, jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu untuk melihat hasilnya. Seharusnya halaman yang muncul bukanlah daftar buku di halaman main, tetapi akan di-redirect ke halaman login.

"},{"location":"tutorial/tutorial-3/#tutorial-menggunakan-data-dari-cookies","title":"Tutorial: Menggunakan Data Dari Cookies","text":"

Sekarang, kita akan melihat penggunaan cookies dengan menambahkan data last login dan menampilkannya ke halaman main.

  1. Lakukan logout terlebih dahulu apabila kamu sedang menjalankan aplikasi Django-mu.

  2. Buka kembali views.py yang ada pada subdirektori main. Tambahkan import HttpResponseRedirect, reverse, dan datetime pada bagian paling atas.

import datetime\nfrom django.http import HttpResponseRedirect\nfrom django.urls import reverse\n
  1. Pada fungsi login_user, kita akan menambahkan fungsionalitas menambahkan cookie yang bernama last_login untuk melihat kapan terakhir kali pengguna melakukan login. Caranya adalah dengan mengganti kode yang ada pada blok if user is not None menjadi potongan kode berikut.
...\nif user is not None:\n    login(request, user)\n    response = HttpResponseRedirect(reverse(\"main:show_main\"))\n    response.set_cookie('last_login', str(datetime.datetime.now()))\n    return response\n...\n

Penjelasan Kode:

Perhatikan indentasi kode kamu, pastikan tidak terdapat dead code pada fungsi tersebut.

  1. Pada fungsi show_main, tambahkan potongan kode 'last_login': request.COOKIES['last_login'] ke dalam variabel context. Berikut adalah contoh kode yang sudah diubah.
context = {\n    'name': 'Pak Bepe',\n    'class': 'PBP A',\n    'books': books,\n    'last_login': request.COOKIES['last_login'],\n}\n

Penjelasan Kode:

'last_login': request.COOKIES['last_login'] berfungsi menambahkan informasi cookie last_login pada response yang akan ditampilkan di halaman web.

  1. Ubah fungsi logout_user menjadi seperti potongan kode berikut.
def logout_user(request):\n    logout(request)\n    response = HttpResponseRedirect(reverse('main:login'))\n    response.delete_cookie('last_login')\n    return response\n

Penjelasan Kode:

response.delete_cookie('last_login') berfungsi untuk menghapus cookie last_login saat pengguna melakukan logout.

  1. Buka berkas main.html dan tambahkan potongan kode berikut di setelah tombol logout untuk menampilkan data last login.
...\n<h5>Sesi terakhir login: {{ last_login }}</h5>\n...\n
  1. Silakan refresh halaman login (atau jalankan proyek Django-mu dengan perintah python manage.py runserver jika kamu belum menjalankan proyekmu) dan cobalah untuk login. Data last login kamu akan muncul di halaman main.

  2. Jika kamu menggunakan browser Google Chrome, untuk melihat data cookie last_login, kamu dapat mengakses fitur inspect element dan membuka bagian Application/Storage. Klik bagian Cookies dan kamu dapat melihat data cookies yang tersedia. Selain last_login, kamu juga dapat melihat data sessionid dan csrftoken. Berikut adalah contoh tampilannya.

  1. Jika kamu melakukan logout dan membuka bagian riwayat cookie, cookie yang dibuat sebelumnya akan hilang dan dibuat ulang ketika kamu login kembali.

Sebelum melanjutkan ke tutorial berikutnya, cobalah untuk membuat satu akun pada halaman web kamu.

"},{"location":"tutorial/tutorial-3/#tutorial-menghubungkan-model-book-dengan-user","title":"Tutorial: Menghubungkan Model Book dengan User","text":"

Kamu perlu mengikuti tutorial secara berurut dari awal sebelum menjalankan bagian berikut. Jika kamu tidak mengikuti tutorial secara berurut, maka kami tidak bertanggung jawab atas error di luar pembahasan tutorial yang dapat muncul dari bagian tutorial berikut.

Terakhir, kita akan menghubungkan setiap objek Book yang akan dibuat dengan pengguna yang membuatnya, sehingga pengguna yang sedang terotorisasi hanya melihat buku-buku yang telah dibuat sendiri. Untuk itu, ikuti langkah-langkah berikut:

  1. Buka models.py yang ada pada subdirektori main dan tambahkan kode berikut pada dibawah baris kode untuk mengimpor model:
...\nfrom django.contrib.auth.models import User\n...\n
  1. Pada model Book yang sudah dibuat, tambahkan potongan kode berikut:
class Book(models.Model):\n    user = models.ForeignKey(User, on_delete=models.CASCADE)\n    ...\n

Penjelasan Kode:

Potongan kode diatas berfungsi untuk menghubungkan satu buku dengan satu user melalui sebuah relationship, dimana sebuah buku pasti terasosiasikan dengan seorang user. Lebih lanjutnya terkait ForeignKey akan dipelajari pada mata kuliah Basis Data. Penjelasan lebih lanjut terkait ForeignKey pada Django dapat dilihat di sini.

  1. Buka kembali views.py yang ada pada subdirektori main, dan ubah potongan kode pada fungsi create_book menjadi sebagai berikut:
def create_book(request):\n form = BookForm(request.POST or None)\n\n if form.is_valid() and request.method == \"POST\":\n     book = form.save(commit=False)\n     book.user = request.user\n     book.save()\n     return redirect('main:show_main')\n\n context = {'form': form}\n return render(request, \"create_book.html\", context)\n ...\n

Penjelasan Kode:

Parameter commit=False yang digunakan pada potongan kode diatas berguna untuk mencegah Django agar tidak langsung menyimpan objek yang telah dibuat dari form langsung ke database. Hal tersebut memungkinkan kita untuk memodifikasi terlebih dahulu objek tersebut sebelum disimpan ke database. Pada kasus ini, kita akan mengisi field user dengan objek User dari return value request.user yang sedang terotorisasi untuk menandakan bahwa objek tersebut dimiliki oleh pengguna yang sedang login.

  1. Ubah fungsi show_main menjadi sebagai berikut.
def show_main(request):\n    books = Book.objects.filter(user=request.user)\n\n    context = {\n         'name': request.user.username,\n         ...\n    }\n...\n

Penjelasan Kode:

  1. Ketik angka 1 lagi untuk menetapkan user dengan ID 1 (yang sudah kita buat sebelumnya) pada model yang sudah ada.

  1. Lakukan python manage.py migrate untuk mengaplikasikan migrasi yang dilakukan pada poin sebelumnya.

Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000/ di browser favoritmu untuk melihat hasilnya. Cobalah untuk membuat akun baru dan login dengan akun yang baru dibuat. Amatilah halaman utama, buku yang tadi telah dibuat dengan akun sebelumnya tidak akan ditampilkan di halaman pengguna akun yang baru saja kamu buat. Hal tersebut berarti kamu sudah berhasil menghubungkan objek Book dengan User yang membuatnya.

"},{"location":"tutorial/tutorial-3/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu telah menyelesaikan Tutorial 3 dengan baik. \ud83d\ude04

Setelah kamu menyelesaikan seluruh tutorial di atas, harapannya kamu sekarang lebih paham tentang penggunaan form, autentikasi, session, dan cookie pada framework Django.

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  1. Pada akhir tutorial ini, struktur subdirektori main pada lokalmu terlihat seperti ini.

  1. Sebelum melakukan langkah ini, pastikan struktur direktori lokal sudah benar. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  2. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-3/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-3/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2024 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023/2024. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-4/","title":"Tutorial 4: Desain Web Menggunakan HTML dan CSS3 & Metode Update dan Delete pada Data","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-4/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-4/#pengenalan-html","title":"Pengenalan HTML","text":"

HyperText Markup Language (HTML) adalah bahasa markup standar untuk dokumen agar dapat ditampilkan dalam browser web. HTML mendefinisikan struktur dari konten suatu website.

Silakan pelajari dan mencoba sendiri HTML pada referensi ini.

Perbedaan antara HTML dan HTML5 bisa kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#pengenalan-css","title":"Pengenalan CSS","text":""},{"location":"tutorial/tutorial-4/#apa-itu-css","title":"Apa itu CSS?","text":"

Cascading Style Sheets (CSS) adalah bahasa yang digunakan untuk mendeskripsikan tampilan dan format dari sebuah situs web yang ditulis pada markup language (seperti HTML). CSS berguna untuk membuat tampilan situs web menjadi lebih menarik.

Untuk mempelajari perbedaan antara CSS dan CSS3 bisa kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#cara-penulisan-css","title":"Cara Penulisan CSS","text":"

Secara umum, CSS dapat dituliskan dalam bentuk sebagai berikut.

selector {\n  properties: value;\n}\n

Silakan pelajari dan mencoba sendiri CSS pada referensi ini.

Terdapat tiga jenis cara penulisan CSS:

  1. Inline Styles
  2. Internal Style Sheet
  3. External Style Sheet

Silakan pelajari tentang ketiga jenis CSS tersebut pada referensi ini.

Perlu diperhatikan, jika kamu membuat jenis External Style Sheet, kamu perlu menambahkan tag {% load staticfiles %} pada halaman HTML kamu. Contohnya seperti potongan kode di bawah ini.

{% load staticfiles %}\n<html>\n  <head>\n    <title>Tutorial CSS Yay</title>\n    <link rel=\"stylesheet\" href=\"{% static 'css/tutorial.css' %}\" />\n  </head>\n  <body>\n    <div>\n      <h1>Tutorial CSS Yay</h1>\n    </div>\n    <div id=\"main\">\n      <div>\n        <p>published: 27 September 2023</p>\n        <h1><a href=\"\">Tutorial CSS ku</a></h1>\n        <p>Yay ini tutorial yang gampang!</p>\n      </div>\n    </div>\n  </body>\n</html>\n

Hal ini dapat terjadi karena CSS merupakan static files di Django. Static files akan dijelaskan pada bagian selanjutnya.

"},{"location":"tutorial/tutorial-4/#catatan-tambahan","title":"Catatan Tambahan","text":"

Jika terdapat lebih dari satu style yang didefinisikan untuk suatu elemen, maka style yang akan diterapkan adalah yang memiliki prioritas yang lebih tinggi. Berikut ini urutan prioritasnya, nomor 1 yang memiliki prioritas paling tinggi.

  1. Inline style
  2. External dan internal style sheets
  3. Browser default
"},{"location":"tutorial/tutorial-4/#static-files-pada-django","title":"Static files pada Django","text":"

Pada framework Django, terdapat file-file yang disebut dengan static files. Static files merupakan file-file pendukung HTML pada suatu situs web. Contoh static files adalah CSS, JavaScript, dan gambar.

Pengaturan untuk static files terletak pada file settings.py:

...\n# Static files (CSS, JavaScript, Images)\n# httpsdocs.djangoproject.comen1.9howtostatic-files\nSTATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')\nSTATIC_URL = 'static'\n...\n
Pada settings.py, terdapat:

Perintah collectstatic adalah perintah untuk mengumpulkan static files dari semua app sehingga mempermudah akses untuk semua app.

Penjelasan lebih lengkap mengenai static files dapat kamu baca pada referensi ini.

"},{"location":"tutorial/tutorial-4/#selector-pada-css","title":"Selector pada CSS","text":"

Pada tutorial ini, kita akan mengenak tiga jenis selector: Element Selector, ID Selector, dan Class Selector.

  1. ELement Selector

    Element Selector memungkinkan kita mengubah properti untuk semua elemen yang memiliki tag HTML yang sama.

    Contoh penggunaan Element Selector:

    <body>\n  <div>\n    <h1>Tutorial CSS Yay :D</h1>\n    <h2>Tutorial CSS Yay kedua :D</h2>\n  </div>\n  ...\n</body>\n

    Kita dapat menggunakan element sebagai selector dalam file CSS. Element selector menggunakan format [id_name] (tanpa diawali oleh sebuah simbol)

    h1 {\n  color: #fca205;\n  font-family: \"Monospace\";\n  font-style: italic;\n}\n
    2. ID Selector

    ID selector menggunakan ID pada tag sebagai selector-nya. ID bersifat unik dalam satu halaman web. ID dapat ditambahkan pada halaman template HTML.

    Contoh penggunaan ID Selector pada template HTML:

    <body>\n  <div id=\"header\">\n    <h1>Tutorial CSS Yay :D</h1>\n  </div>\n  ...\n</body>\n

    Kemudian, kita dapat menggunakan ID tersebut sebagai selector dalam file CSS. ID selector menggunakan format #[id_name] (selalu diawali #)

    #header {\n  background-color: #f0f0f0;\n  margin-top: 0;\n  padding: 20px 20px 20px 40px;\n}\n

  2. Class Selector

    Class Selector memungkinkan kita untuk mengelompokkan elemen dengan karakteristik yang sama.

    Contoh penggunaan Class Selector pada template HTML:

    ...\n<div id=\"main\">\n    <div class=\"content_section\">\n        <p class=\"date\">published: 28 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS ku</a></h2>\n        <p id=\"content_1\">Yay ini tutorial yang gampang!</p>\n    </div>\n    <div class=\"content_section\">\n        <p class=\"date \">published: 29 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS mu</a></h2>\n        <p id=\"content_2\">Yay ini tutorial yang mudah!</p>\n    </div>\n    <div class=\"content_section\">\n        <p>published: 30 September 2022</p>\n        <h2><a href=\"\">Tutorial CSS semua</a></h2>\n        <p id=\"content_3\">Yay ini tutorial yang tidak sulit!</p>\n    </div>\n</div>\n...\n

    Kemudian, kita dapat menggunakan Class tersebut sebagai selector dalam file CSS. Class selector menggunakan format .[class_name] (diawali .)

    .content_section {\n  background-color: #3696e1;\n  margin-bottom: 30px;\n  color: #000000;\n  font-family: cursive;\n  padding: 20px 20px 20px 40px;\n}\n

Untuk memperdalam pengetahuan mengenai CSS Selector Reference, kamu dapat membaca referensi ini.

"},{"location":"tutorial/tutorial-4/#tips-trik-css","title":"Tips & trik CSS","text":""},{"location":"tutorial/tutorial-4/#mengenal-combinator-pada-css","title":"Mengenal Combinator pada CSS","text":"

Combinator dalam CSS menghubungkan dua atau lebih selector untuk merincikan lebih lanjut elemen-elemen yang di-select.

Terdapat empat combinators pada CSS. Berikut ringkasan pemakaiannya:

Combinator Contoh pemakaian Penjelasan contoh Descendant selector (space) div p Menyeleksi semua elemen p yang merupakan keturunan dari elemen div Child selector (>) div > p Menyeleksi semua elemen p yang merupakan anak dari elemen div Adjacent sibling selector (+) div + p Menyeleksi elemen p pertama yang berada tepat setelah elemen div (harus memiliki elemen induk yang sama) General sibling selector (~) div ~ p Menyeleksi semua elemen p yang sejajar dan berada setelah elemen div

Silakan pelajari lebih lanjut mengenai combinator melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#mengenal-pseudo-class-pada-css","title":"Mengenal Pseudo-class pada CSS","text":"

Pseudo-class digunakan untuk mendefinisikan state khusus dari suatu elemen. Sintaks pemakaian pseudo-class adalah sebagai berikut:

selector:pseudo-class {\n  property: value;\n}\n

Beberapa contoh pseudo-class: | Pseudo-class | Mengaplikasikan style pada .. | | -------- | -------- | | :link | tautan yang belum pernah dikunjungi | | :visited | tautan yang sudah pernah dikunjungi | | :hover | saat pengguna mengarahkan kursor di atas elemen tersebut | | :active | saat elemen diaktifkan (biasanya saat pengguna mengklik elemen tersebut) | | :focus | saat elemen fokus (seperti saat pengguna mengklik input field) | | :checked | elemen yang telah dicentang | | :disabled | elemen yang telah dibuat tidak responsif (misalnya tombol yang tidak bisa diklik) |

Silakan pelajari lebih lanjut mengenai pseudo-class melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#mengenal-box-model-pada-css","title":"Mengenal Box Model pada CSS","text":"

Box model pada CSS pada dasarnya merupakan suatu box yang membungkus setiap elemen HTML dan terdiri atas:

Silakan pelajari lebih lanjut mengenai margin, border, dan padding melalui referensi ini.

"},{"location":"tutorial/tutorial-4/#pengenalan-bootstrap-tailwind","title":"Pengenalan Bootstrap & Tailwind","text":"

Pada bidang pengembangan web, terdapat banyak framework CSS yang sering digunakkan. Fungsi sebuah framework adalah untuk mempermudah pekerjaan programmer pada saat mengerjakan pekerjaan mereka. Framework CSS yang populer saat ini adalah Bootstrap dan juga Tailwind. Kedua framework ini memberikan banyak kelebihan dibandingkan CSS yang biasa kita gunakan. Berikut adalah kelebihan-kelebihan penggunaan framework yang diperoleh dibandingkan CSS biasa:

  1. Proses Pengembangan Lebih Cepat: Framework seperti Bootstrap menyediakan komponen siap pakai sehingga tanpa harus menulis kode CSS dari awal.
  2. Responsif secara Bawaan: Framework seperti Bootstrap dan Tailwind telah dirancang dengan responsif.
  3. Skalabilitas Besar: Framework CSS memberikan struktur yang baik untuk proyek yang berkembang seiring waktu.

Bootstrap dan Tailwind tentu saja sebagai framework memiliki perbedaan yang signifikan antara satu sama lain, yaitu:

Tailwind Bootstrap Tailwind CSS membangun tampilan dengan menggabungkan kelas-kelas utilitas yang telah didefinisikan sebelumnya. Bootstrap menggunakan gaya dan komponen yang telah didefinisikan, yang memiliki tampilan yang sudah jadi dan dapat digunakan secara langsung. Tailwind CSS memiliki file CSS yang lebih kecil sedikit dibandingkan Bootstrap dan hanya akan memuat kelas-kelas utilitas yang ada Bootstrap memiliki file CSS yang lebih besar dibandingkan dengan Tailwind CSS karena termasuk banyak komponen yang telah didefinisikan. Tailwind CSS memiliki memberikan fleksibilitas dan adaptabilitas tinggi terhadap proyek Bootstrap sering kali menghasilkan tampilan yang lebih konsisten di seluruh proyek karena menggunakan komponen yang telah didefinisikan. Tailwind CSS memiliki pembelajaran yang lebih curam karena memerlukan pemahaman terhadap kelas-kelas utilitas yang tersedia dan bagaimana menggabungkannya untuk mencapai tampilan yang diinginkan. Bootstrap memiliki pembelajaran yang lebih cepat untuk pemula karena dapat mulai dengan komponen yang telah didefinisikan."},{"location":"tutorial/tutorial-4/#responsive-web-design","title":"Responsive Web Design","text":"

Responsive web design merupakan metode sistem desain web yang memiliki tujuan untuk menghasilkan tampilan web yang terlihat baik pada seluruh perangkat seperti desktop, tablet, mobile, dan sebagainya. Responsive web design tidak mengubah isi dari situs web, tetapi hanya mengubah tampilan dan penataan pada setiap perangkat agar sesuai dengan lebar layar dan kemampuan perangkat tersebut. Dalam responsive web design tampilan-tampilan tertentu membutuhkan bantuan CSS (seperti mengecilkan atau membesarkan) suatu elemen.

Salah satu cara untuk menguji apakah suatu situs web menggunakan responsive web design adalah dengan mengakses situs web tersebut dan mengaktifkan fitur Toggle Device Mode pada browser. Fitur ini memungkinkan kamu untuk melihat bagaimana situs web tersebut ditampilkan pada berbagai perangkat, seperti komputer, tablet, atau smartphone, tanpa harus mengubah ukuran jendela browser.

Berikut adalah cara untuk mengakses fitur tersebut pada browser Google Chrome. * Windows/Linux : CTRL + SHIFT + M * Mac : Command + Shift + M

Cara lain yang lebih praktis adalah dengan melakukan klik kanan pada browser dan memilih Inspect Element/Inspect untuk membuka Dev Tools yang berguna.

Untuk mempelajari lebih lengkap mengenai Reponsive Web Design, kamu dapat membuka referensi ini.

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-bootstrap-ke-aplikasi","title":"Tutorial: Menambahkan Bootstrap ke Aplikasi","text":"

Pada mata kuliah PBP ini, kita akan memfokuskan pembelajaran CSS menggunakan framework bootstrap. Berikut adalah langkah yang perlu kamu lakukan untuk menyelesaikan bagian tutorial ini.

  1. Buka project django kalian (book_tracker), lalu buka file base.html yang telah dibuat sebelumnya pada templates folder yang berada di root project kalian.

  2. Didalam templates/base.html, tambahkan tag agar halaman web kamu dapat menyesuaikan ukuran dan perilaku perangkat mobile (apabila belum).

    <head>\n    {% block meta %}\n        <meta charset=\"UTF-8\" />\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    {% endblock meta %}\n</head>\n
  3. Tambahkan Bootstrap CSS dan juga JS.

    CSS:

    <head>\n    {% block meta %}\n        ...\n    {% endblock meta %}\n    <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN\" crossorigin=\"anonymous\">\n</head>\n

    JS:

    <head>\n    ...\n    <script src=\"https://code.jquery.com/jquery-3.6.0.min.js\" integrity=\"sha384-KyZXEAg3QhqLMpG8r+J4jsl5c9zdLKaUk5Ae5f5b1bw6AUn5f5v8FZJoMxm6f5cH1\" crossorigin=\"anonymous\"></script>\n</head>\n

  4. (Opsional) Apabila kalian ingin menggunakan dropdowns, popover, tooltips yang disediakan framework Bootstrap, maka kalian perlu menambahkan 2 baris script JS ini dibawah script JS yang sudah kalian buat sebelumnya.

    <head>\n    ...\n    <script src=\"https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js\" integrity=\"sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r\" crossorigin=\"anonymous\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js\" integrity=\"sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+\" crossorigin=\"anonymous\"></script>\n</head>\n

Referensi: Get Started with Bootstrap 5.3

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-navbar-pada-aplikasi","title":"Tutorial: Menambahkan navbar pada Aplikasi","text":"

Tambahkan navigation bar (boleh menggunakan Bootstrap) pada halaman main.html kamu. Tampilkan nama kamu dan tombol logout pada navigation bar yang kamu buat. Kamu dapat referensi cara membuat navigation bar pada Bootstrap dengan dokumentasi berikut dan kreasikan navigation bar sesukamu.

"},{"location":"tutorial/tutorial-4/#tutorial-menambahkan-fitur-edit-pada-aplikasi","title":"Tutorial: Menambahkan Fitur Edit pada Aplikasi","text":"
  1. Buka views.py yang ada pada subdirektori main, dan buatlah fungsi baru bernama edit_book yang menerima parameter request dan id.

  2. Tambahkan potongan kode berikut pada fungsi edit_book

    def edit_book(request, id):\n    # Get book berdasarkan ID\n    book = Book.objects.get(pk = id)\n\n    # Set book sebagai instance dari form\n    form = BookForm(request.POST or None, instance=book)\n\n    if form.is_valid() and request.method == \"POST\":\n        # Simpan form dan kembali ke halaman awal\n        form.save()\n        return HttpResponseRedirect(reverse('main:show_main'))\n\n    context = {'form': form}\n    return render(request, \"edit_book.html\", context)\n
  3. Buatlah berkas HTML baru dengan nama edit_book.html pada subdirektori main/templates. Isi berkas tersebut dengan template berikut.

    {% extends 'base.html' %}\n\n{% load static %}\n\n{% block content %}\n\n<h1>Edit Book</h1>\n\n<form method=\"POST\">\n    {% csrf_token %}\n    <table>\n        {{ form.as_table }}\n        <tr>\n            <td></td>\n            <td>\n                <input type=\"submit\" value=\"Edit Book\"/>\n            </td>\n        </tr>\n    </table>\n</form>\n\n{% endblock %}\n
  4. Buka urls.py yang berada pada direktori main dan import fungsi edit_book yang sudah dibuat.

    from main.views import edit_book\n
  5. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor tadi.

    ...\npath('edit-book/<int:id>', edit_book, name='edit_book'),\n...\n
  6. Buka main.html yang berada pada subdirektori main/templates. Tambahkan potongan kode berikut sejajar dengan elemen <td> terakhir agar terlihat tombol edit pada setiap baris tabel.

    ...\n<tr>\n    ...\n    <td>\n        <a href=\"{% url 'main:edit_book' book.pk %}\">\n            <button>\n                Edit\n            </button>\n        </a>\n    </td>\n</tr>\n...\n
  7. Jalankan proyek Django-mu dengan perintah python manage.py runserver dan bukalah http://localhost:8000 di browser favoritmu. Setelah login, coba untuk meng-edit data suatu buku. Apabila setelah di-submit perubahan tersimpan dan tercermin pada halaman utama aplikasi tanpa error, maka selamat, kamu berhasil menambahkan fitur edit!

"},{"location":"tutorial/tutorial-4/#tutorial-membuat-fungsi-untuk-menghapus-data-buku","title":"Tutorial: Membuat Fungsi untuk Menghapus Data Buku","text":"

Berikut adalah yang perlu kamu lakukan untuk membuat fungsi penghapusan data buku.

  1. Buat fungsi baru dengan nama delete_book yang menerima parameter request dan id pada views.py di folder main untuk menghapus data buku. Kamu dapat menggunakan templat kode berikut untuk memuat fungsinya.

    Jangan lupa untuk memahami isi kodenya, ya. \ud83d\ude09

    def delete_book(request, id):\n    # Get data berdasarkan ID\n    book = Book.objects.get(pk = id)\n    # Hapus data\n    book.delete()\n    # Kembali ke halaman awal\n    return HttpResponseRedirect(reverse('main:show_main'))\n
  2. Buka urls.py yang ada pada folder main dan impor fungsi yang sudah kamu buat tadi.

    from main.views import delete_book\n
  3. Tambahkan path url ke dalam urlpatterns untuk mengakses fungsi yang sudah diimpor.

    ...\npath('delete/<int:id>', delete_book, name='delete_book'), # sesuaikan dengan nama fungsi yang dibuat\n...\n
  4. Bukalah berkas main.html yang ada pada folder main/templates dan ubahlah kode yang sudah ada menjadi seperti berikut agar terdapat tombol hapus untuk setiap buku.

    ...\n<tr>\n    ...\n    <td>\n        <a href=\"{% url 'main:edit_book' book.pk %}\">\n            <button>\n                Edit\n            </button>\n        </a>\n        <a href=\"{% url 'main:delete_book' book.pk %}\">\n              <button>\n                  Delete\n              </button>\n          </a>\n    </td>\n</tr>\n...\n

Jalankan proyek Django-mu dan cobalah untuk menghapus data buku yang sudah ada pada browser favoritmu.

"},{"location":"tutorial/tutorial-4/#akhir-kata","title":"Akhir Kata","text":"

Selamat! Kamu telah menyelesaikan Tutorial 4 dengan baik. \ud83d\ude04

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  1. Kamu juga diharapkan untuk melakukan eksplorasi dengan menggunakan CSS Framework pada tutorial ini. Berikut adalah contoh penerapan Bootstrap sederhana pada aplikasi Book Tracker.

  2. Selanjunya, lakukan add, commit dan push untuk memperbarui repositori GitHub.

  3. Jalankan perintah berikut untuk melakukan add, commit dan push.

git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-4/#referensi-tambahan","title":"Referensi Tambahan","text":"

Kamu dapat membuka beberapa tautan dibawah untuk melihat beberapa opsi kode yang dapat kamu gunakan untuk menambahkan navigation bar - Dengan menggunakan Bootstrap, dapat diakses melalui link ini - Dengan menggunakan CSS secara manual, dapat diakses melalui link ini

"},{"location":"tutorial/tutorial-4/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-4/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2023 dan PBP Genap 2023 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"},{"location":"tutorial/tutorial-5/","title":"Tutorial 5: JavaScript dan AJAX","text":"

Pemrograman Berbasis Platform (CSGE602022) \u2014 diselenggarakan oleh Fakultas Ilmu Komputer Universitas Indonesia, Semester Genap 2023/2024

"},{"location":"tutorial/tutorial-5/#tujuan-pembelajaran","title":"Tujuan Pembelajaran","text":"

Setelah menyelesaikan tutorial ini, mahasiswa diharapkan untuk dapat:

"},{"location":"tutorial/tutorial-5/#javascript","title":"JavaScript","text":""},{"location":"tutorial/tutorial-5/#pengenalan-javascript","title":"Pengenalan JavaScript","text":"

JavaScript merupakan bahasa pemrograman multi-paradigma tingkat tinggi lintas platform (cross-platform high-level multi-paradigm programming language). Sifat multi-paradigma membuat JavaScript mendukung konsep pemrograman berbasis obyek, pemrograman imperatif, dan pemrograman fungsional. JavaScript sendiri merupakan implementasi dari ECMAScript, yang merupakan inti dari bahasa JavaScript. Beberapa implementasi lain dari ECMAScript yang mirip dengan JavaScript antara lain JScript (Microsoft) dan ActionScript (Adobe).

JavaScript, bersama dengan HTML dan CSS, menjadi tiga teknologi utama yang dipakai pada pengembangan web. Pada dasarnya, keuntungan menggunakan JavaScript dalam pengembangan web adalah manipulasi halaman web dapat dilakukan secara dinamis dan interaksi antara halaman web dengan pengguna dapat meningkat. Oleh karena itu, hampir semua situs web modern saat ini menggunakan JavaScript dalam halaman web mereka untuk memberikan pengalaman terbaik kepada pengguna. Beberapa contoh yang dapat kita lakukan dengan menggunakan JavaScript antara lain menampilkan informasi berdasarkan waktu, mengenali jenis peramban pengguna, melakukan validasi form atau data, membuat cookies (bukan kue, namun HTTP cookies), mengganti styling dan CSS suatu element secara dinamis, dan lain sebagainya.

Pada pengembangan web umumnya kode JavaScript digunakan pada client-side suatu web (client-side JavaScript), namun beberapa jenis kode JavaScript saat ini digunakan pada server-side suatu web (server-side JavaScript) seperti node.js. Istilah client-side menunjukkan bahwa kode JavaScript akan dieksekusi atau dijalankan pada peramban pengguna, bukan pada server situs web. Hal ini berarti kompleksitas kode JavaScript tidak akan memengaruhi performa server situs web tersebut namun memengaruhi performa peramban web dan komputer; semakin kompleks kode JavaScript, maka semakin banyak memori komputer yang dikonsumsi oleh peramban web.

Pada mata kuliah PBP, kita hanya akan fokus kepada kode client-side JavaScript.

"},{"location":"tutorial/tutorial-5/#tahapan-eksekusi-javascript-oleh-peramban","title":"Tahapan Eksekusi JavaScript oleh Peramban","text":"

Perhatikan diagram berikut untuk mengamati tahapan eksekusi JavaScript oleh peramban web.

Setelah peramban mengunduh halaman HTML web maka tepat dimana tag <script></script> berada, peramban akan melihat tag script tersebut, apakah tag tersebut berisi kode embedded JavaScript atau merujuk berkas eksternal JavaScript. Jika merujuk pada berkas eksternal JavaScript, maka peramban akan mengunduh berkas tersebut terlebih dahulu.

"},{"location":"tutorial/tutorial-5/#penulisan-javascript","title":"Penulisan JavaScript","text":"

Penulisan JavaScript dapat dilakukan dengan embedded JavaScript atau external JavaScript. Kode JavaScript dapat didefinisikan atau dituliskan secara embedded pada berkas HTML maupun secara terpisah pada berkas tersendiri. Jika ditulis dalam berkas terpisah dari HTML, ekstensi berkas yang digunakan untuk berkas JavaScript adalah .js. Berikut contoh beberapa pendefinisian dari JavaScript.

JavaScript dapat diletakkan pada head atau body dari halaman HTML. Selain itu, kode JavaScript harus dimasukkan di antara tag <script> dan </script>. Kamu dapat meletakkan lebih dari satu tag script yang berisi JavaScript pada suatu berkas HTML.

"},{"location":"tutorial/tutorial-5/#embedded-javascript-pada-html","title":"Embedded JavaScript pada HTML","text":"

index.html

<script type=\"text/JavaScript\">\n  alert(\"Hello World!\");\n</script>\n
"},{"location":"tutorial/tutorial-5/#external-javascript-pada-html","title":"External JavaScript pada HTML","text":"

index.html

<script type=\"text/JavaScript\" src=\"js/script.js\"></script>\n

js/script.js

alert(\"Hello World!\");\n

Pada berkas eksternal JavaScript, tag <script> tidak perlu lagi ditambahkan.

Memisahkan JavaScript pada berkas tersendiri dapat memberikan beberapa keuntungan seperti kode dapat digunakan di berkas HTML lain, kode JavaScript dan HTML tidak bercampur sehingga lebih fokus saat mengembangkan aplikasi, serta mempercepat proses pemuatan halaman. berkas .js biasanya akan di-cache oleh peramban sehingga jika kita membuka halaman yang sama dan tidak ada perubahan pada berkas .js, maka peramban tidak akan meminta berkas .js tersebut kepada server lagi, namun akan menggunakan berkas dari cache yang sudah disimpan sebelumnya.

"},{"location":"tutorial/tutorial-5/#eksekusi-javascript","title":"Eksekusi JavaScript","text":"

Setelah JavaScript sudah dimuat dengan sempurna, maka peramban akan langsung mulai mengeksekusi kode JavaScript. Jika kode tersebut BUKAN merupakan event-triggered, maka kode langsung dieksekusi. Jika kode tersebut merupakan event-triggered, maka kode tersebut hanya akan dieksekusi jika event yang didefinisikan terpicu (triggered).

// langsung dieksekusi\nalert(\"Hello World\");\n\n// langsung dieksekusi\nvar obj = document.getElementById(\"object\");\n// langsung dieksekusi, menambahkan event handler onclick untuk element object\nobj.onclick = function () {\n  // hanya dieksekusi jika element 'object' di klik\n  alert(\"You just clicked the object!\");\n};\n
"},{"location":"tutorial/tutorial-5/#sintaks-javascript","title":"Sintaks JavaScript","text":""},{"location":"tutorial/tutorial-5/#variabel","title":"Variabel","text":"

Mendefinisikan variabel pada JavaScript cukup mudah. Contohnya seperti berikut.

var example = 0; // var example merupakan sebuah bilangan\nvar example = \"example\"; // var example merupakan sebuah string\nvar example = true; // var example merupakan sebuah boolean\n

JavaScript dapat menampung banyak tipe data; mulai dari string, integer, hingga object sekalipun. Berbeda dengan Java yang penandaan tipe datanya dibedakan dengan head variable (contohnya kamu ingin membuat variabel dengan tipe data int, maka sintaknya seperti int x = 9), JavaScript mempunyai ciri khas loosely typed atau dynamic language, yakni kamu tidak perlu menuliskan tipe data pada head variable dan JavaScript nantinya akan secara otomatis membaca tipe data kamu berdasarkan standar yang ada (seperti pada contoh di atas).

Ada beberapa aturan dalam pemilihan indentifiers atau nama variabel dalam JavaScript. Karakter pertama harus merupakan alfabet, underscore (_), atau karakter dolar ($). Selain itu, JavaScript identifiers bersifat case sensitive.

"},{"location":"tutorial/tutorial-5/#penggabungan-string","title":"Penggabungan String","text":"

Dalam JavaScript, kita juga dapat menyambungkan string dengan string lainnya seperti pada Java.

var str1 = \"PBP\" + \" \" + \"Fun\";\nvar str2 = \"PBP\";\nvar str3 = \"Fun\";\nvar str4 = str2 + \" \" + str3;\nvar str5 = \"Fun\";\nvar str6 = `PBP ${str5}`;  // Memiliki hasil yang sama seperti \"PBP\" + \" \" + str5\n
"},{"location":"tutorial/tutorial-5/#ruang-lingkup-javascript","title":"Ruang Lingkup JavaScript","text":""},{"location":"tutorial/tutorial-5/#variabel-lokal","title":"Variabel Lokal","text":"

Variabel yang didefinisikan di dalam fungsi bersifat lokal, sehingga hanya dapat diakses oleh kode didalam fungsi tersebut.

// kode diluar fungsi thisFunction() tidak dapat mengakses variabel courseName\nfunction thisFunction() {\n  var courseName = \"PBP\";\n  // kode di dalam fungsi ini dapat mengakses variabel courseName\n}\n
"},{"location":"tutorial/tutorial-5/#variabel-global","title":"Variabel Global","text":"

Variabel yang didefinisikan di luar fungsi bersifat global dan dapat diakses oleh kode lain dalam berkas JavaScript tersebut.

var courseName = \"PBP\";\nfunction thisFunction() {\n  // kode di dalam fungsi ini dapat mengakses variabel courseName\n}\n
"},{"location":"tutorial/tutorial-5/#variabel-auto-global","title":"Variabel Auto Global","text":"

Value yang di-assign pada variabel yang belum dideklarasikan otomatis menjadi variabel global, walaupun variabel tersebut berada di dalam suatu fungsi.

thisFunction(); // fungsi thisFunction() perlu dipanggil terlebih dahulu\nconsole.log(courseName); // cetak \"PBP\" pada JavaScript console\nfunction thisFunction() {\n  courseName = \"PBP\";\n}\n
"},{"location":"tutorial/tutorial-5/#mengakses-variabel-global-dari-html","title":"Mengakses Variabel Global dari HTML","text":"

Kamu dapat mengakses variabel yang berada dalam berkas JavaScript pada berkas HTML yang memuat berkas JavaScript tersebut.

...\n<input type=\"text\" onclick=\"this.value=courseName\" />\n...\n
...\nvar courseName = \"PBP\";\n...\n
"},{"location":"tutorial/tutorial-5/#function-dan-event","title":"Function dan Event","text":"

Function adalah sekumpulan grup dari kode-kode yang bisa dipanggil di mana pun pada bagian kode program (mirip dengan method pada Java). Hal ini mengurangi redundansi kode yang ada (mengurangi kode-kode yang dapat sama berulang-ulang). Selain itu, function pada JavaScript sangat berguna untuk memudahkan elemen pemanggilan secara dinamis. Function dapat dipanggil sesama function dan dapat juga dipanggil karena event (akan dijelaskan di bawah). Sebagai contoh, berikut kode yang terdapat pada index.html.

...\n<input type=\"button\" value=\"magicButton\" id=\"magicButton\" onclick=\"hooray();\" />\n...\n

Kemudian berikut adalah kode pada javascript.js.

...\nfunction hooray(){\n    alert(\"Yahoo!\");\n}\n...\n

Apabila magicButton ditekan, maka fungsi onclick akan menjalankan function hooray() pada javascript.js, lalu muncul alert sesuai yang sudah di-assign sebelumnya.

Kode onclick sebenarnya adalah salah satu contoh kemampuan JavaScript yang disebut event. Event adalah kemampuan JavaScript untuk membuat sebuah situs web dinamis. Maksud dari onclick adalah penanda apa yang akan dilakukan JavaScript jika elemen tersebut ditekan. Selain itu, event biasanya diberikan sebuah fungsi yang berguna sebagai perintah-perintah untuk JavaScript. Selain itu, banyak contoh-contoh event lainnya seperti onchange, onmouseover, onmouseout, dan lain sebagainya yang bisa kamu baca pada tautan ini.

"},{"location":"tutorial/tutorial-5/#javascript-dom","title":"JavaScript DOM","text":""},{"location":"tutorial/tutorial-5/#html-dom","title":"HTML DOM","text":"

HTML DOM (Document Object Model) adalah standar bagaimana mengubah, mengambil, dan menghapus HTML elements. HTML DOM dapat diakses melalui JavaScript atau dengan bahasa pemrograman lainnya. Detail lengkapnya dapat dilihat di sini.

Berikut adalah contoh implementasinya.

...     \n<div>\n  <p onclick=\"myFunction()\" id=\"demo\">Example of HTML DOM</p>\n\n</div>\n...\n
...\n    function myFunction() {\ndocument.getElementById(\"demo\").innerHTML = \"YOU CLICKED ME!\";\n    }\n...\n
"},{"location":"tutorial/tutorial-5/#css-dom","title":"CSS DOM","text":"

Sama dengan HTML DOM, CSS DOM dapat mengubah CSS secara dinamis melalui JavaScript. Detail lengkapnya dapat dilihat di sini.

Berikut adalah contoh implementasinya.

index.html

...\n<p id=\"blueText\" onclick=\"changeColor()\">Click me v2</p>\n...\n

javascript.js

...\nfunction changeColor(){\n    document.getElementById(\"blueText\").style.color=\"blue\";\n}\n...\n
"},{"location":"tutorial/tutorial-5/#ajax","title":"AJAX","text":""},{"location":"tutorial/tutorial-5/#pengenalan-ajax","title":"Pengenalan AJAX","text":"

AJAX merupakan singkatan dari Asynchronous JavaScript And XML.

AJAX bukanlah merupakan sebuah bahasa pemrograman, melainkan sebuah teknologi yang memadukan peramban web (untuk meminta data dari web server) dengan JavaScript dan HTML DOM (untuk menampilkan data). AJAX dapat menggunakan XML untuk mengirim data, tetapi AJAX juga dapat menggunakan teks ataupun JSON untuk mengirim data. AJAX memungkinkan halaman web untuk memperbarui data secara asinkronus dengan mengirimkan data ke peladen di balik layar. Hal tersebut berarti bahwa kita dapat memperbarui sebagian elemen data pada halaman tanpa harus me-reload halaman secara keseluruhan.

Berikut ini adalah diagram cara kerja AJAX.

  1. Sebuah event terjadi pada halaman web (contohnya tombol submit data ditekan)
  2. Sebuah XMLHttpRequest object dibuat oleh JavaScript
  3. XMLHttpRequest object mengirimkan request ke server
  4. Server memproses request tersebut
  5. Server mengembalikan response kembali kepada halaman web
  6. Response dibaca oleh JavaScript
  7. Aksi berikutnya akan dipicu oleh JavaScript sesuai dengan langkah yang dibuat (contohnya memperbarui data di halaman tersebut)

Pada PBP kali ini, kamu akan melakukan AJAX pada peramban web dengan menggunakan fungsi fetch() yang diberikan oleh JavaScript. Secara gambaran besar, penggunaan fetch() untuk melakukan pemanggilan AJAX dapat dilihat di tautan ini.

"},{"location":"tutorial/tutorial-5/#fetch-api","title":"Fetch API","text":"

Fetch API merupakan API baru yang diperkenalkan pada ECMAScript 2020 sebagai standar baru untuk membuat request dengan Promise. Fetch API menyediakan antarmuka untuk mengambil sumber daya (termasuk di seluruh jaringan). API ini merupakan pengganti yang lebih kuat dan fleksibel untuk XMLHttpRequest. Fetch API secara umum digunakan untuk mengimplementasikan AJAX secara lebih mudah daripada AJAX dengan XMLHttpRequest. Fetch API juga mendukung lebih banyak metode HTTP dan header HTTP daripada AJAX biasa.

Fungsi fetch() memiliki beberapa parameter, yaitu:

Fungsi fetch() mengembalikan objek Response. Objek Response memiliki beberapa properti, yaitu:

Kamu dapat mempelajari Fetch API lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#fungsi-async-dan-await","title":"Fungsi Async dan Await","text":"

Sebelum mempelajari penggunaan fungsi fetch(), ada baiknya kita mempelajari fungsi async dan await yang memungkinkan pengimplementasian AJAX tanpa perlu menggunakan library eksternal, seperti jQuery.

Fungsi async dan await merupakan fungsi baru yang diperkenalkan di ECMAScript 2017. Fungsi async digunakan untuk menandai fungsi sebagai fungsi yang dapat mengembalikan nilai secara asinkronus, sedangkan fungsi await digunakan untuk menunggu hasil dari fungsi async.

Kamu dapat mempelajari fungsi async dan await lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#penggunaan-fetch-api","title":"Penggunaan Fetch API","text":"

Fetch API menyediakan antarmuka JavaScript untuk mengakses dan memanipulasi bagian-bagian protokol, seperti requests dan responses. API ini juga menyediakan metode fetch() global yang menyediakan cara yang mudah dan logis untuk mengambil sumber daya secara asinkronus pada seluruh jaringan.

Tidak seperti XMLHttpRequest yang merupakan API berbasis callback, Fetch API berbasis Promise dan menyediakan alternatif yang lebih baik dan dapat dengan mudah digunakan pada service worker. Fetch API juga mengintegrasikan konsep HTTP tingkat lanjut seperti CORS dan ekstensi lain ke HTTP.

Berikut adalah contoh penggunaan Fetch API dengan fungsi async dan await untuk melakukan AJAX.

async function fetchData() {\n  const response = await fetch(\"https://jokes-bapack2-api.yuana.id/v1/text/random\");\n  const data = await response.json();\n  return data;\n}\n\nconst joke = await fetchData();\nconsole.log(joke);\n

Kode di atas akan melakukan AJAX untuk meminta data dari API lelucon bapak-bapak masa kini secara asinkronus. Hasil dari AJAX akan disimpan dalam variabel joke.

Kamu dapat mempelajari penggunaan Fetch API lebih lanjut pada tautan ini.

"},{"location":"tutorial/tutorial-5/#tutorial-membuat-fungsi-untuk-menambahkan-buku-dengan-ajax","title":"Tutorial: Membuat Fungsi untuk Menambahkan Buku dengan AJAX","text":"

Pada bagian ini, kamu akan membuat fungsi pada views untuk menambahkan buku baru ke basis data dengan AJAX.

  1. Buatlah fungsi baru pada views.py dengan nama add_book_ajax yang menerima parameter request.

  2. Impor from django.views.decorators.csrf import csrf_exempt pada berkas views.py.

  3. Tambahkan dekorator @csrf_exempt di atas fungsi add_book_ajax yang sudah kamu buat.

  4. Isilah fungsi tersebut dengan kode berikut.

    ...\n@csrf_exempt\ndef add_book_ajax(request):\n    if request.method == 'POST':\n        name = request.POST.get(\"name\")\n        page = request.POST.get(\"page\")\n        description = request.POST.get(\"description\")\n        user = request.user\n\n        new_book = Book(name=name, page=page, description=description, user=user)\n        new_book.save()\n\n        return HttpResponse(b\"CREATED\", status=201)\n\n    return HttpResponseNotFound()\n

    Penjelasan Kode:

"},{"location":"tutorial/tutorial-5/#tutorial-menambahkan-routing-untuk-fungsi-add_book_ajax","title":"Tutorial: Menambahkan Routing Untuk Fungsi add_book_ajax","text":"
  1. Buka berkas urls.py pada folder main dan impor fungsi add_book_ajax.

  2. Tambahkan path url fungsi tersebut ke dalam urlpatterns.

    ...\npath('create-book-ajax/', add_book_ajax, name='add_book_ajax'),\n
"},{"location":"tutorial/tutorial-5/#tutorial-menampilkan-data-book-dengan-fetch-api","title":"Tutorial: Menampilkan Data Book dengan Fetch() API","text":"
  1. Bukalah berkas main.html pada main/templates dan hapuslah bagian kode table yang sudah kamu buat pada tutorial sebelumnya.

  2. Tambahkanlah kode berikut sebagai struktur table.

    <table id=\"book_table\"></table>\n
  3. Buatlah block <Script> di bagian bawah berkas kamu dan buatlah fungsi baru pada block <Script> tersebut dengan nama getBooks().

    <script>\n    async function getBooks() {\n        return fetch(\"{% url 'main:show_json' %}\").then((res) => res.json())\n    }\n</script>\n

    Penjelasan Kode:

  4. Buatlah fungsi baru pada block <Script> dengan nama refreshBooks() yang digunakan untuk me-refresh data buku secara asynchronous.

    <script>\n    ...\n    async function refreshBooks() {\n        document.getElementById(\"book_table\").innerHTML = \"\"\n        const books = await getBooks()\n        let htmlString = `<tr>\n            <th>Name</th>\n            <th>Page</th>\n            <th>Description</th>\n            <th>Date Added</th>\n        </tr>`\n        books.forEach((item) => {\n            htmlString += `\\n<tr>\n            <td>${item.fields.name}</td>\n            <td>${item.fields.page}</td>\n            <td>${item.fields.description}</td>\n            <td>${item.fields.date_added}</td>\n        </tr>` \n        })\n\n        document.getElementById(\"book_table\").innerHTML = htmlString\n    }\n\n    refreshBooks()\n</script>\n

    Penjelasan Kode:

"},{"location":"tutorial/tutorial-5/#tutorial-membuat-modal-sebagai-form-untuk-menambahkan-buku","title":"Tutorial: Membuat Modal Sebagai Form untuk Menambahkan Buku","text":"
  1. Tambahkan kode berikut untuk mengimplementasikan modal (Bootstrap) pada aplikasi kamu.

    ...\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">Add New Book</h1>\n                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n                <form id=\"form\" onsubmit=\"return false;\">\n                    {% csrf_token %}\n                    <div class=\"mb-3\">\n                        <label for=\"name\" class=\"col-form-label\">Name:</label>\n                        <input type=\"text\" class=\"form-control\" id=\"name\" name=\"name\"></input>\n                    </div>\n                    <div class=\"mb-3\">\n                        <label for=\"page\" class=\"col-form-label\">Page:</label>\n                        <input type=\"number\" class=\"form-control\" id=\"page\" name=\"page\"></input>\n                    </div>\n                    <div class=\"mb-3\">\n                        <label for=\"description\" class=\"col-form-label\">Description:</label>\n                        <textarea class=\"form-control\" id=\"description\" name=\"description\"></textarea>\n                    </div>\n                </form>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n                <button type=\"button\" class=\"btn btn-primary\" id=\"button_add\" data-bs-dismiss=\"modal\">Add Book</button>\n            </div>\n        </div>\n    </div>\n</div>\n...\n

    Form pada modal tersebut sudah disesuaikan untuk model pada aplikasi book_tracker.

    Kamu dapat membaca dokumentasi lebih lanjut mengenai modal pada Bootstrap di sini.

  2. Menambahkan button yang berfungsi untuk menampilkan modal.

    ...\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\">\n    Add Book by AJAX\n</button>\n...\n
"},{"location":"tutorial/tutorial-5/#tutorial-menambahkan-data-book-dengan-ajax","title":"Tutorial: Menambahkan Data Book dengan AJAX","text":"

Modal dengan form yang telah kamu buat sebelumnya belum bisa digunakan untuk menambahkan data buku. Oleh karena itu, kamu perlu membuat fungsi JavaScript baru untuk menambahkan data berdasarkan input ke basis data secara AJAX.

  1. Buatlah fungsi baru pada block <Script> dengan nama addBook(). Isilah fungsi tersebut dengan kode berikut.

    <script>\n    ...\n    function addBook() {\n        fetch(\"{% url 'main:add_book_ajax' %}\", {\n            method: \"POST\",\n            body: new FormData(document.querySelector('#form'))\n        }).then(refreshBooks)\n\n        document.getElementById(\"form\").reset()\n        return false\n    }\n</script>\n

    Penjelasan Kode:

  2. Tambahkan fungsi onclick pada button \"Add Book\" pada modal untuk menjalankan fungsi addBook() dengan menambahkan kode berikut.

    <script>\n...\ndocument.getElementById(\"button_add\").onclick = addBook\n</script>\n

Selamat! Kamu telah berhasil membuat aplikasi yang dapat menambahkan data secara AJAX. Bukalah http://localhost:8000/ dan cobalah untuk mmenambahkan data buku baru pada aplikasi. Seharusnya, sekarang aplikasi tidak perlu melakukan reload setiap kali data buku baru ditambahkan.

"},{"location":"tutorial/tutorial-5/#penutup","title":"Penutup","text":"

Selamat! Kamu telah menyelesaikan Tutorial 5 mengenai AJAX dengan baik. \ud83d\ude04

  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

  2. Kamu juga seharusnya sudah dapat menambahkan buku secara asynchronous dengan menggunakan modal AJAX.

  3. Lakukan add, commit dan push untuk memperbarui repositori GitHub. Jalankan perintah berikut untuk melakukan add, commit dan push.

    git add .\ngit commit -m \"<pesan_commit>\"\ngit push -u origin <branch_utama>\n
"},{"location":"tutorial/tutorial-5/#referensi-tambahan","title":"Referensi Tambahan","text":""},{"location":"tutorial/tutorial-5/#kontributor","title":"Kontributor","text":""},{"location":"tutorial/tutorial-5/#credits","title":"Credits","text":"

Tutorial ini dikembangkan berdasarkan PBP Ganjil 2023 dan PBP Genap 2023 yang ditulis oleh Tim Pengajar Pemrograman Berbasis Platform 2023. Segala tutorial serta instruksi yang dicantumkan pada repositori ini dirancang sedemikian rupa sehingga mahasiswa yang sedang mengambil mata kuliah Pemrograman Berbasis Platform dapat menyelesaikan tutorial saat sesi lab berlangsung.

"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index fd3e146..fb08b74 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git a/tutorial/tutorial-5/index.html b/tutorial/tutorial-5/index.html index 2d3d9b6..a070082 100644 --- a/tutorial/tutorial-5/index.html +++ b/tutorial/tutorial-5/index.html @@ -1733,7 +1733,7 @@

CSS DOM

AJAX

Pengenalan AJAX

-

AJAX merupakan singkatan dari A*synchronous JavaScript And X*ML.

+

AJAX merupakan singkatan dari Asynchronous JavaScript And XML.

AJAX bukanlah merupakan sebuah bahasa pemrograman, melainkan sebuah teknologi yang memadukan peramban web (untuk meminta data dari web server) dengan JavaScript dan HTML DOM (untuk menampilkan data). AJAX dapat menggunakan XML untuk mengirim data, tetapi AJAX juga dapat menggunakan teks ataupun JSON untuk mengirim data. AJAX memungkinkan halaman web untuk memperbarui data secara asinkronus dengan mengirimkan data ke peladen di balik layar. Hal tersebut berarti bahwa kita dapat memperbarui sebagian elemen data pada halaman tanpa harus me-reload halaman secara keseluruhan.

Berikut ini adalah diagram cara kerja AJAX.

ajax-works

@@ -1982,10 +1982,10 @@

Tutorial: Menambahkan Data <

Penutup

Selamat! Kamu telah menyelesaikan Tutorial 5 mengenai AJAX dengan baik. 😄

    -
  1. Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.
  2. -
+
  • +

    Setelah menyelesaikan tutorial ini, tampilan halaman web kamu seharusnya terlihat seperti ini.

    Tampilan Halaman Web

    -
      +
    1. Kamu juga seharusnya sudah dapat menambahkan buku secara asynchronous dengan menggunakan modal AJAX.

      Tampilan Modal

      @@ -2037,7 +2037,7 @@

      Credits

      - 5 Maret 2024 08:25:28 + 5 Maret 2024 08:29:33