UnboundLocalError: локальная переменная 'csv_file', на которую ссылаются до назначения - PullRequest
0 голосов
/ 18 февраля 2020

Когда я запускаю свой код, я получаю следующие ошибки:

if not csv_file.name.endswith('.csv'):

UnboundLocalError: локальная переменная 'csv_file', на которую ссылается перед присваиванием

views.py

import csv, io
from django.shortcuts import render
from django.contrib import messages
from .models import Profile

# Create your views here.# one parameter named request
def profile_upload(request):    # declaring template
    template = "profile_upload.html"
    data = Profile.objects.all()# prompt is a context variable that can have different values      depending on their context
    prompt = {
        'order': 'Order of the CSV should be product_title, sku, slug, image_path, price',
        'profiles': data    
              }
    # GET request returns the value of the data with the specified key.
    if request.method == "GET":
        return render(request, template, prompt)    
        csv_file = request.FILES['file']    # let's check if it is a csv file
    if not csv_file.name.endswith('.csv'):
        messages.error(request, 'THIS IS NOT A CSV FILE')    
        data_set = csv_file.read().decode('UTF-8')    # setup a stream which is when we loop through each line we are able to handle a data in a stream
        io_string = io.StringIO(data_set)
        next(io_string)
        for column in csv.reader(io_string, delimiter=',', quotechar="|"):
            _, created = Profile.objects.update_or_create(
                name=column[0],
                email=column[1],
                address=column[2],
                phone=column[3],
                profile=column[4]
            )
        context = {}
        return render(request, template, context)


Я не уверен, почему я получаю эту ошибку, было бы здорово, если бы кто-нибудь мог помочь мне понять, что я делаю неправильно.

Ответы [ 4 ]

0 голосов
/ 18 февраля 2020

Вы написали более сложные логи c там ...

Сначала вы должны проверить, есть ли файл или нет

Затем вы должны написать свое условие для if not csv_file.name.endswith('.csv'):

Пример: -

def profile_upload(request):    
    # your logic  

    if request.method == "GET":
        csv_file = request.FILES['file']
        return render(request, template, prompt)    
    else:
        csv_file = None

    if csv_file:
        if not csv_file.name.endswith('.csv'):
            # your logic
            return render(request, template, context)
0 голосов
/ 18 февраля 2020

область действия переменной здесь ограничена, поэтому определите переменную с пустым в начале, чтобы использовать ее далее как:

csv_file = ''// overwrites Empty if value found in condition
if request.method == "GET":   
    csv_file = request.files['file']... //files for FILES as per docs
0 голосов
/ 18 февраля 2020

Вы получаете эту ошибку, потому что переменная определена, только если метод запроса GET. Иначе, если метод POST, вы не определили его, но попробуйте использовать здесь:

if not csv_file.name.endswith('.csv'):

Кроме того, возможно сделать этот код неудачным, потому что вы определили эту переменную как request.FILES['file'], где есть не может быть файла в запросе. Вы можете изменить это на:

csv_file = request.FILES.get('file')
if not csv_file:
    # raise error

И, наконец, это лучший способ использовать сериализаторы или формы для проверки данных запроса.

0 голосов
/ 18 февраля 2020

Вам нужно будет инициализировать переменную csv_file в начале метода или в любом другом месте перед назначением или ссылкой на переменную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...