Импорт CSV Django

У меня есть приложение, которое используется для оценки студентов, поэтому у меня есть некоторые атрибуты, такие как 'absensi', 'tugas', 'uts' и 'uas' в app_nilai и другой используемый foreignkey, который связан с их объектом, он включает 'mahasiswa', 'kelas' и 'matakuliah' в app_matkul. У этого объекта есть каждая переменная для объяснения. Когда я помещаю файл импорта в html, он не работает, но в админке он действительно работает. Не могли бы вы проверить мою программу и где проблема? Замечено: Никаких сообщений об ошибках или сбоях не появилось, что заставило меня запутаться в том, где проблема

Forms.py in app_nilai

class NilaiForm(ModelForm):
def __init__(self, *args, **kwargs):
    super(NilaiForm, self).__init__(*args, **kwargs)
    self.fields['mahasiswa'].widget.attrs['readonly'] = True
    self.fields['mahasiswa'].widget.attrs['class'] = 'form-control-plaintext'

class Meta:
    model = Nilai
    fields = ('mahasiswa', 'absensi', 'tugas', 'uts', 'uas')
    widgets = {
        'mahasiswa': forms.TextInput(attrs={'readonly': 'readonly', 'class': 'form-control-plaintext'}),
        'absensi': forms.TextInput(attrs={'class': 'form-control'}),
        'tugas': forms.TextInput(attrs={'class': 'form-control'}),
        'uts': forms.TextInput(attrs={'class': 'form-control'}),
        'uas': forms.TextInput(attrs={'class': 'form-control'})
    }

class UploadCSVForm(forms.Form):
    csv_file = forms.FileField()

views.py in app_nilai

def import_csv(request, kelas_id):
    kelas = get_object_or_404(Kelas, id=kelas_id)
    
    if request.method == 'POST':
        form = UploadCSVForm(request.POST, request.FILES)
        if form.is_valid():
            csv_file = request.FILES['csv_file']

            dataset = Dataset()
            imported_data = dataset.load(csv_file.read().decode('utf-8'), format='csv')

            nilai_resource = NilaiResource()
            result = nilai_resource.import_data(imported_data, dry_run=True, use_transactions=True, raise_errors=True, kelas_id=kelas_id)

            if not result.has_errors():
                import_result = nilai_resource.import_data(imported_data, dry_run=False, use_transactions=True, raise_errors=True, kelas_id=kelas_id, update=True)
                messages.success(request, 'Data berhasil diimpor.')
            else:
                messages.error(request, 'Terjadi kesalahan saat mengimpor data.')
        else:
            messages.error(request, 'Form tidak valid.')
        return redirect('nilai_kelas', kelas_id=kelas_id)

    form = UploadCSVForm()
    return render(request, 'import_csv.html', {'form': form, 'kelas': kelas})

resource.py in app_nilai

class NilaiResource(resources.ModelResource):
    data_id = fields.Field(
        column_name='id',
        attribute='pk'
    )

    mahasiswa = fields.Field(
        column_name='mahasiswa',
        attribute='mahasiswa',
        widget=ForeignKeyWidget(Mahasiswa, 'id')
    )
    
    matakuliah = fields.Field(
        column_name='matakuliah',  # Ganti nama kolom ini untuk menghindari konflik
        attribute='mata_kuliah',
        widget=ForeignKeyWidget(MataKuliah, 'id')
    )

    kelas = fields.Field(
        column_name='kelas',
        attribute='kelas',
        widget=ForeignKeyWidget(Kelas, 'id')
    )

    class Meta:
        model = Nilai
        fields = ('data_id', 'mahasiswa', 'matakuliah', 'kelas', 'absensi', 'tugas', 'uts', 'uas')
        import_id_fields = ('data_id',)

    def before_import_row(self, row, **kwargs):
        kelas_id = kwargs.get('kelas_id')
        row['kelas'] = kelas_id

модель в app_nilai

from tkinter import CASCADE
from django.core.validators import MaxValueValidator
from django.db import models
from django.contrib.auth.models import User
from app_matkul.models import Kelas, Mahasiswa, MataKuliah

class Nilai(models.Model):
    mahasiswa = models.ForeignKey(Mahasiswa, on_delete=models.SET_NULL, blank=True, null=True)
    mata_kuliah = models.ForeignKey(MataKuliah, on_delete=models.SET_NULL,blank=True,null=True)
    kelas = models.ForeignKey(Kelas, on_delete=models.SET_NULL,blank=True,null=True)

    absensi = models.IntegerField(default=0, validators=[MaxValueValidator(100)])
    tugas = models.IntegerField(default=0, validators=[MaxValueValidator(100)])
    uts = models.IntegerField(default=0, validators=[MaxValueValidator(100)])
    uas = models.IntegerField(default=0, validators=[MaxValueValidator(100)])
    updated_at = models.DateTimeField(auto_now=True)
    
    @property
    def perhitungan_nilai(self):
        nilai_absen = self.absensi * (15/100)
        nilai_tugas = self.tugas * (35/100)
        nilai_uts = self.uts * (20/100)
        nilai_uas = self.uas * (30/100)
        olah = nilai_absen + nilai_tugas + nilai_uts + nilai_uas
        
        if olah >=60 and olah <=70 :
            return 70
        
        else :
            return int (olah)
    
    def logika_nilai(self):
        if self.perhitungan_nilai >=80:
            return 'A'
        
        elif self.perhitungan_nilai >=75:
            return 'AB'
        
        elif self.perhitungan_nilai >=70:
            return 'B'
        
        elif self.perhitungan_nilai >=50:
            return 'D'

        else :
            return 'E'
        
    @classmethod
    def rata_rata_nilai(cls, kelas_id):
        nilai_mahasiswa = cls.objects.filter(kelas__id=kelas_id)
        total_nilai = sum(a.perhitungan_nilai for a in nilai_mahasiswa)
        count = nilai_mahasiswa.count()
        return total_nilai / count if count > 0 else 0
        
    def __str__(self):
        return str(self.mahasiswa.nama)
    
    class Meta :
        ordering = ['mahasiswa']
        verbose_name_plural = '1. Nilai Akhir'

HTML

        <form method="POST" enctype="multipart/form-data" action="{% url 'import_csv' kelas.id %}">
          {% csrf_token %}
          <div class="mb-3">
              <label for="csv_file" class="form-label">Import File CSV</label>
              <input type="file" class="form-control" id="csv_file" name="csv_file" accept=".csv" required>
          </div>
          <button type="submit" class="btn btn-sm btn-outline-primary">Import CSV</button>
          <a href="{% url 'export_csv' kelas.id %}" class="btn btn-sm btn-outline-info">Unduh Template CSV</a>
        </form>

импорт и экспорт с django работает

Вернуться на верх