Замечено: сообщений об ошибках или сбоях не появилось, что меня смутило, в чем проблема.
Forms.py в 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()
Код: Выделить всё
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})
Код: Выделить всё
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
Код: Выделить всё
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 =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'
Код: Выделить всё
{% csrf_token %}
Import File CSV
Import CSV
[url={% url ]Unduh Template CSV[/url]
Подробнее здесь: https://stackoverflow.com/questions/785 ... csv-django