Upload dan Import File Excel ke Database Menggunakan Django Import Export

Ucoepoe
By -
0

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)




export-excel-dengan-django-import-export

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
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. 




Posting Komentar

0 Komentar

Posting Komentar (0)

#buttons=(Ok, Go it!) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Ok, Go it!