【发布时间】:2020-11-04 18:50:07
【问题描述】:
我正在处理一个学校管理项目,我想上传一个 CSV 文件并通过覆盖当前数据或在数据库中更新它来保存它。但它没有被添加到数据库中。另外,我喜欢添加更多字段,因此如果可能的话,使用动态(即通过循环),这样我以后就不必更改它了。
models.py
class Student(models.Model):
registration_number = models.CharField(max_length=200, unique=True)
firstname = models.CharField(max_length=200)
surname = models.CharField(max_length=200)
date_of_birth = models.DateField(default=timezone.now)
current_class = models.ForeignKey(StudentClass, on_delete=models.SET_NULL, blank=True, null=True)
date_of_admission = models.DateField(default=timezone.now)
parent_mobile_number = models.CharField(max_length=15)
address = models.TextField()
class StudentBulkUpload(models.Model):
date_uploaded = models.DateTimeField(auto_now=True)
csv_file = models.FileField(upload_to='students/bulkupload/')
forms.py
class StudentBulkUploadForm(forms.ModelForm):
class Meta:
model = StudentBulkUpload
fields = ("csv_file",)
views.py
def uploadcsv(request):
if request.method == 'GET':
form = StudentBulkUploadForm()
return render(request, 'students/students_upload.html', {'form':form})
# If not GET method then proceed
try:
form = StudentBulkUploadForm(data=request.POST, files=request.FILES)
if form.is_valid():
csv_file = form.cleaned_data['csv_file']
if not csv_file.name.endswith('.csv'):
messages.error(request, 'File is not CSV type')
return redirect('students:student-upload')
# If file is too large
if csv_file.multiple_chunks():
messages.error(request, 'Uploaded file is too big (%.2f MB)' %(csv_file.size(1000*1000),))
return redirect('students:student-upload')
file_data = csv_file.read().decode('utf-8')
lines = file_data.split('\n')
# loop over the lines and save them in db. If error, store as string and then display
for line in lines:
fields = line.split(',')
data_dict = {}
print(data_dict)
try:
form = StudentBulkUploadForm(data_dict)
if form.is_valid():
form.save()
else:
logging.getLogger('error_logger').error(form.errors.as_json())
except Exception as e:
logging.getLogger('error_logger').error(form.errors.as_json())
pass
except Exception as e:
logging.getLogger('error_logger').error('Unable to upload file. ' + repr(e))
messages.error(request, 'Unable to upload file. ' + repr(e))
return redirect('students:student-upload')
student_upload.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-success" value="Submit">
</form>
【问题讨论】:
-
我认为标题应该更新为“将数据从上传的CSV文件写入数据库”
-
不确定,但django import-export 可能适合您的情况。
-
你的 csv 文件有标题吗?
标签: python django csv export-to-csv