Django: Как я могу изменять значения с помощью views.py

#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)