Skip to main content
 首页 » 编程设计

python之Django之UnboundLocalError

2024年08月13日49langtianya

我在 View 中有一个函数,用于上传 CSV 数据并写入数据库。那部分正在工作。但是,当我尝试检查是否有数据更新或创建时,我收到一条错误消息:

"local variable 'created' referenced before assignment".

View 中的函数如下

def bookings_upload(request): 
 
    prompt = { 
        'order': "Please import a valid CSV file" 
    } 
    if request.method == "GET": 
        return render(request, 'booking_app/importBookings.html', prompt) 
 
    csv_file = request.FILES['bookings'] 
 
    if not csv_file.name.endswith('.csv'): 
        messages.error(request, "This file is not a .csv file.") 
        return redirect('/booking_app/bookings_upload/')  
 
    data_set = csv_file.read().decode('utf-8') 
    io_string = io.StringIO(data_set) 
    next(io_string) 
 
    for column in csv.reader(io_string, delimiter=',', quotechar="|"): 
        _, created = Bookings.objects.update_or_create( 
            book_date=column[0], 
            grower_number=column[1], 
            bales_booked=column[3], 
            sale_date=column[6], 
            book_id=column[11], 
            reoffer=column[12] 
        ) 
    )  
 
    if created: 
        messages.success(request, "Bookings have been imported successfully") 
    else: 
        messages.warning(request, "No new bookings were imported. Please check/verify your csv file")    
 
    context = {} 
    return render(request, 'booking_app/importBookings.html', context) 

我错过了什么?任何帮助将不胜感激。

请您参考如下方法:

@lmiguelvargasf 的回答解释了正在发生的事情,但我认为更好的重构是:

n_created = 0 
for column in csv.reader(io_string, delimiter=",", quotechar="|"): 
    _, created = Bookings.objects.update_or_create( 
        book_date=column[0], 
        grower_number=column[1], 
        bales_booked=column[3], 
        sale_date=column[6], 
        book_id=column[11], 
        reoffer=column[12], 
    ) 
    if created: 
        n_created += 1 
 
if n_created: 
    messages.success(request, "%d bookings have been imported successfully" % n_created) 
else: 
    messages.warning(request, "No new bookings were imported. Please check/verify your csv file")