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