Django 2 ke Django 3

G. Prasetyadi
64 views

information-communications-technology

Tak sadar saya bahwa Django 3 versi LTS (tepatnya Django 3.2) telah dirilis beberapa waktu lalu. Gas pol akses server via SSH, ternyata tidak bisa langsung install. Proses migrasi dari Django 2 memerlukan beberapa perubahan konfigurasi.

1. Muncul warning pada model tanpa PK eksplisit

Pesan errornya seperti ini:

nama_app.MyModel: (models.W000) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
    HINT: Configure the DEFAULT_AUTO_FIELD setting or the MyAppConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.

Paling gampang adalah menambahkan DEFAULT_AUTO_FIELD: django.db.models.AutoField pada file settings.py (ini kalau memang menggunakan integer auto-increment biasa), atau spesifik ke app MyAppConfig seperti petunjuk pada pesan warning di atas.

Atau bisa juga mulai tentukan primary key field secara eksplisit di model di app.

2. Elemen i-frame pada template tidak bisa dimuat

Perubahan pada Django 3 adalah untuk proteksi click-jacking, kita harus spesifik menentukan X_FRAME_OPTIONS di settings.py. Untuk kasus saya, ada beberapa proyek web yang menggunakan 3rd party text editor widget yang memerlukan i-frame.

Selain itu, SECURE_CONTENT_TYPE_NOSNIFF sekarang default ke True. Django sekarang akan menambahkan header X-Content-Type-Options: nosniff ke semua response.

3. django.utils.six sudah tidak didukung

Library kompatibilitas Python 2 - Python 3 sudah tidak didukung, salah satunya yang menyebabkan error di proyek saya adalah django.utils.six. Solusinya ya tulis ulang kode atau gunakan paket six. Adapun dukungan Python 2 sebenarnya sudah dihapus sejak Django 2.

Lain-lain

Django 3 juga sudah mulai memantapkan dukungan terhadap async-programming, yang berjalan di bawah ASGI.

Pada kasus saya, menangani tiga hal di atas dengan benar langsung bisa membuat proses migrasi OK. Lebih aman lagi, pelajari release note satu persatu.

Untuk variabel conf dari template proyek yang dihasilkan dari startproject juga ada perubahan, misalnya BASE_DIR:

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

sehingga mendefinisikan path subdir juga cukup dengan / 'subdir':

DB_FILE = BASE_DIR / 'db.sqlite3'

Komentar