#django #view
Вопрос:
Я пытаюсь создать страницу «загрузка», чтобы я мог загрузить файл и обработать его в базу данных postgres с помощью pd.to_sql(). Все данные были успешно записаны в БД, но не могут изменить значения «is_recorded» и «has_issue». Вот файлы, над которыми я работаю до сих пор.
В upload/models.py
from django.db import models
class Upload(models.Model):
file_name = models.FileField(upload_to='uploads', max_length=255)
uploaded = models.DateTimeField(auto_now_add=True)
# When uploaded successfully
is_recorded = models.BooleanField(default=False)
# When it has a problem to fix
has_issue = models.BooleanField(default=False)
def __str__(self):
return f'{self.file_name}: {self.id}'
В views.py
import os
from django.shortcuts import render
from core.db_implements import upload_csv_to_DB
from upload.forms import UploadForm
from upload.models import Upload
def upload_view(request):
error_message = None
success_message = None
form = UploadForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
form = UploadForm()
try:
obj = Upload.objects.get(is_recorded=False)
recorded, issue, success_message, error_message = ***upload_csv_to_DB***(obj)
obj.is_recorded = recorded
obj.has_issue = issue
obj.save()
success_message = success_message
error_message = error_message
except:
error_message = 'Something went wrong.'
context={
'form': form,
'success_message': success_message,
'error_message': error_message,
}
return render(request, 'upload/upload.html', context)
В forms.py
from django import forms
from django.db.models import fields
from django.forms.fields import FileField
from django.forms.models import ModelFormMetaclass
from .models import Upload
class UploadForm(forms.ModelForm):
# file_name = forms.FileField(max_length=255, label=False)
class Meta:
model=Upload
fields = ('file_name',)
widgets = {
'file_name': forms.FileInput(
attrs={
'class': 'form-control',
}
)
}
Я передаю на аутсорсинг функцию (upload_csv_to_DB), которая берет объект файла, преобразует его в фрейм данных и записывает в БД. В случае успеха, recorded=True с success_message должен быть возвращен, однако, если что-то не так, issue=True с error_message должен быть возвращен. В любом случае, запись и выдача всегда ложны, и наличие error_message из предложения except «Что-то пошло не так».. Пожалуйста, посоветуйте мне…
Ответ №1:
Я понял причину. Я не инициализировал возвращаемое значение функции аутсорсинга, upload_csv_to_DB
. После инициализации возвращаемых значений все работает так, как задумывалось. Вот код, который решает эту проблему.
В upload_csv_to_DB.py
:
def upload_csv_to_DB(csv_obj):
recorded = False
issue = False
success_message = None
error_message = None
upload_file = csv_obj.file_name.path
...
return (recorded, issue, success_message, error_message)
В views.py
:
def upload_view(request):
error_message = None
success_message = None
recorded =False
issue = False
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.save()
try:
obj = Upload.objects.get(is_recorded=False)
recorded, issue, success_message, error_message = upload_csv_to_DB(obj)
obj.is_recorded = recorded
obj.has_issue = issue
obj.save()
success_message = success_message
error_message = error_message
except:
error_message = 'Something went wrong.'
else:
form = UploadForm()
context={
'form': form,
'success_message': success_message,
'error_message': error_message,
}
return render(request, 'upload/upload.html', context)