T(caps)erkadang kita perlu mengupload dan mengimport file excel ke database untuk kemudian diproses lagi untuk keperluan spesifik. Menggunakan Django, kegiatan ini dapat dilakukan dengan lebih mudah karena kita dapat menggunakan library yang tersedia sehingga kita tidak perlu menuliskan sintaks dan logika yang rumit. Inilah salah satu kelebihan Django, dimana kita dapat menyelesaikan kasus dengan lebih cepat dengan penulisan kode yang sangat ringkas.
Pada kesempatan ini, kita akan membuat sebuah django apps untuk mengupload file excel dan langsung memparsing dan mengimportnya ke database. Pada kasus ini, file excel yang diupload tidak disimpan sama sekali pada server, tetapi langsung diimport ke database. Mungkin anda dapat mengganti kondisi ini sesuai dengan kebutuhan anda untuk menghindari hal-hal yang tidak diinginkan.
(toc) #title=(Table of Content)
![]() |
Upload dan Import File Excel dengan Django Import Export |
Tentang Django Import Export
Django-import-export merupakan library django yang dapat digunakan untuk mengimport dan mengexport data dengan fitur yang melimpah. Untuk dokumentasinya sendiri tergolong sangat lengkap, dan dapat diakses melalui link dokumentasinya. Django import export juga dapat diintegrasikan dengan library-library python lainnya sehingga dapat lebih powerfull. Django import export juga mendukung berbagai macam file mulai dari excel, json, csv, dan lainnya yang didukung oleh Tablib.
Requirement
Sebelum anda memulainya, pastikan pada lingkungan kerja python anda sudah terinstall:
- Django (versi 5.2.6 atau yang lebih baru)
- Psycopg (sesuaikan dengan kebutuhan database) (versi 3.2.10 atau yang lebih baru)
- Django-import-export (versi 4.3.10 atau yang lebih baru)
- Djangorestframework (versi 3.16.1 atau yang lebih baru)
- Openpyxl (versi 3.1.5 atau yang lebih baru)
- tablib['xlsx'] (sesuaikan dengan kebutuhan upload file) (versi 3.8.0 atau yang lebih baru)
Untuk menginstall paket tersebut, anda dapat menjalankan perintah:
pip install django psycopg django-import-export djangorestframework openpyxl tablib['xlsx']
Mengatur Config untuk Django-Import-Export
Untuk mengatur konfigurasi django-import-export, anda harus memasukkan import_export ke dalam file settings.py project Django anda.
# settings.py
.......
INSTALLED_APPS = (
...
'import_export',
)
.......
Membuat Model Siswa
Katakanlah kita mempunyai sebuah table siswa yang digunakan untuk menampung data yang akan diimport dari excel. Berikut merupakan contoh model untuk kasus kita kali ini.
# models.py
from django.db import models
class Siswa(models.Model):
nis = models.CharField(max_length=10, unique=True)
nama = models.CharField(max_length=255)
alamat = keterangan = models.TextField(null=True, blank=True)
tahun = models.CharField(max_length=15)
def __str__(self):
return str(self.nis)
Menyiapkan ModelResource
Untuk perantara antara django-import-export dengan model, kita membutuhkan sebuah class ModelResource. Class ini berfungsi seperti sebuah Serializer, dimana kita dapat memasukkan function atau method ke dalam class tersebut, bahkan juga mendukung class Meta. Kita perlu membuat file baru bernama resources.py ke dalam django apps kita.
# resources.py
from import_export import resources
from .models import Siswa
class SiswaResource(resources.ModelResource):
class Meta:
model = Siswa
import_id_fields = ['nis',]
skip_unchanged = True
use_bulk = True
Penjelasan option pada class Meta:
- model : merujuk ke model yang digunakan sebagai referensi;
- import_id_fields: berisi kolom yang bersifat unik dari model, ini dimaksudkan untuk menghindari duplikasi data;
- skip_unchange = Jika diset True, model akan diperbaharui jika salah satunya berubah.
- use_bulk = manfaatkan penggunaan bulk_create
Untuk fitur lainnya, silahkan mempelajarinya pada halaman dokumentasinya.
Membuat Form Upload
Untuk mengupload file excel ke database, kita perlu membuat sebuah form upload. buatlah sebuah file forms.py pada direktori apps anda.
#forms.py
from django import forms
import os
class UploadFileForm(forms.Form):
upload = forms.FileField(
label='Select a file',
help_text='Allowed file types: .csv, .xls, .xlsx',
widget=forms.ClearableFileInput(attrs={
'accept': '.csv,.xls,.xlsx',
'class': 'custom-file-input'}
)
)
def clean_upload(self):
file = self.cleaned_data.get('upload')
if file:
ext = os.path.splitext(file.name)[1].lower()
valid_extensions = ['.csv', '.xls', '.xlsx']
if ext not in valid_extensions:
raise forms.ValidationError('File tidak didukung. Hanya dapat upload: csv, xls, xlsx.')
return file
Membuat Template Excel Siswa
Excel yang diupload haruslah konsisten, karena excel tersebut akan diimport langsung ke database. Jika tidak, maka akan terjadi error karena format tidak sesuai dengan template yang diharapkan. Adapun contoh template siswa adalah sebagai berikut.
![]() |
Tabel Siswa di Excel |
Menyiapkan Views
Adapun views.py untuk django-import-export adalah sebagai berikut:
# views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render
from django.contrib import messages
from tablib import Dataset
from rest_framework import generics
from .forms import UploadFileForm
from .models import Siswa
from .resources import SiswaResource
class UploadView(LoginRequiredMixin, generics.GenericAPIView):
template_name = "absensi/upload.html"
form_class = UploadFileForm
def get(self, request):
form = self.form_class()
return render(request, self.template_name, context={'form': form})
def post(self, request):
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
siswa_resorce = SiswaResource()
dataset = Dataset()
# Handle the uploaded file
uploaded_file = request.FILES['upload']
imported_data = dataset.load(uploaded_file.read(), format='xlsx')
no=0
for data in imported_data:
nis =data[1]
nama = data[2]
alamat = data[3]
tahun = data[4]
value = Siswa(nis=nis,
nama=nama,
alamat=alamat,
tahun=tahun)
value.save()
no+=1
messages.success(request, f'{no} record berhasil diinput.')
return render(request, self.template_name, {'form': form})
else:
# jika form tidak valid
for field, errors in form.errors.items():
for error in errors:
if field == '__all__': # Non-field errors
messages.error(request, f'Error: {error}')
else:
messages.error(request, f'{field.capitalize()}: {error}')
return render(request, self.template_name, {'form': form})
Mempersiapkan Template Upload
Untuk menampikan form upload, juga perlu disiapkan template upload.html yang berisi kode html yang nantinya dipanggil melalui views.
#templates/siswa/upload.html
<div class="card card-primary card-outline">
<div class="card-header">
<h3 class="card-title">Form Upload Rekap Data</h3>
</div>
<form enctype="multipart/form-data" id="form-input" method="post">
{% csrf_token %}
<div class="card-body">
<div class="form-group row justify-content-center mt-4">
<label class="col-sm-3 col-form-label">Rekap Data Excel</label>
<div class="col-sm-6">
<div class="custom-file">
{{ form.upload }}
<label class="custom-file-label">Pilih rekap data...</label>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="d-flex justify-content-between">
<button class="btn btn-outline-secondary btn-sm" type="reset">
<i class="fas fa-rotate-left"></i> Reset
</button>
<button class="btn btn-outline-primary btn-sm float-right" type="submit">
<i class="fas fa-file-arrow-up"></i> Upload
</button>
</div>
</div>
</form>
</div>
Hasil Akhir
Setelah melakukan persiapan sebagaimana telah dijalankan diatas, kita dapat dengan mudah mengupload dan mengimport data dari excel ke dalam model Django. Sebenarnya masih sangat banyak ekstensi/ jenis file yang dapat digunakan untuk diimport ke dalam model Django dengan menggunakan Django-import-export. Anda dapat mempelajarinya melalui dokumentasi django-import-export dan Tablib.
![]() |
Hasil Import Data |
Kesimpulan
Mengupload dan mengimport file excel ke model django memang lebih mudah dan powerfull menggunakan django-import-export. Namun, metode yang digunakan dalam tutorial ini juga punya beberapa kekurangan. Misalnya saat format yang yang diupload tidak sesuai dengan yang ditentukan, tentu akan terjadi error sehingga data tidak dapat diupload atau malah hasil importnya yang tidak sesuai dengan kebutuhan aplikasi. Selain itu, teknik upload pada tutorial ini juga mengharuskan file excel langsung dibaca dan diparsing oleh aplikasi. Ini akan sangat beresiko jika file yang diupload berisi script malware atau trojan yang berbahanya bagi server. Mengupload file yang sangat besar juga akan membebani proses penyimpanan data.
Sekian tutorial ini, semoga dapat bermanfaat bagi yang membutuhkan. Jika ada kendala, jangan sungkan-sungkan untuk bertanya pada kolom komentar. Saya akan berusaha secepatnya untuk membantu.