Импорт 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 работает