Ошибка индекса в /user_upload/ (индекс списка вне диапазона для пользовательской модели)

#django

#django

Вопрос:

Несмотря на то, что следующий код работает, он выдает указанную ошибку. Это для импорта данных в пользовательскую модель.

 def user_upload(request):
    template = "client_admin/user_upload.html"
    data = User.objects.all()
    if request.method == "GET":
        return render(request, template, prompt)
    csv_file = request.FILES['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')
    io_string = io.StringIO(data_set)
    next(io_string)

    for column in csv.reader(io_string, delimiter=',', quotechar="|"):
        _, created = User.objects.update_or_create(
            username=column[0],
            first_name=column[1],
            last_name=column[2],
            email=column[3],
        )
    context = {}
    return render(request, template, context)
  

и пользовательская модель

 class User(AbstractUser):
    is_approved = models.CharField(max_length=80, choices=APPROVAL_CHOICES, default='t-2')
    is_member = models.BooleanField(default=False)
    is_premium_member = models.BooleanField(default=False)
  

трассировка

 Traceback:

File "/home/biju/Desktop/Dev/multitenant/lib/python3.8/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/biju/Desktop/Dev/multitenant/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/home/biju/Desktop/Dev/multitenant/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/biju/Documents/mtenant/client_admin/views.py" in user_upload
  66.             username=column[0],

Exception Type: IndexError at /user_upload/
Exception Value: list index out of range
  

Комментарии:

1. ошибка возникает с обратной трассировкой

2. username=column[0], это трассировка, я не знаю номер inedex пользовательского класса

3. итак, в основном у вас есть пустая строка в вашем csv, и вы пытаетесь получить доступ к первому элементу, который в данном случае не существует

Ответ №1:

У вас есть пустая строка в csv, и вы не проверяете, есть ли в строке количество столбцов, которые вы ожидаете от нее, поэтому вы могли бы сделать что-то вроде этого

 for column in csv.reader(io_string, delimiter=',', quotechar="|"):
    if len(column) > 3:
        _, created = User.objects.update_or_create(
            username=column[0],
            first_name=column[1],
            last_name=column[2],
            email=column[3],
        )