Ошибка CSV при загрузке файла в админке Django - PullRequest
0 голосов
/ 07 мая 2019

Я загружаю файл через администратора и выполняю небольшую очистку и сохраняю данные в модели.

Так что в утилитах у меня есть небольшая функция

def _map_file_to_model(row):
    _into_product = {
        "qr_id": "",
        "ean": "",
        "description": "",
        "category": "",
        "marketing_text": "",
        "bullet": "",
        "brand_image": "",
        "image": ""
    }

    return {
        _into_product[key]: value
        for key, value in row.items()
    }

это представление модели. В админке я этим занимаюсь

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    change_list_template = 'product/products_blob.html'
    date_hierarchy = 'created_at'

    def get_urls(self):
        urls = super().get_urls()
        qr_urls = [
            path('import-file/', self.import_file, name='import-file'),
        ]
        return qr_urls + urls

    def import_file(self, request):
        if request.method == "POST":
            _file = request.FILES['text_file']
            reader = csv.reader(_file)

            self.message_user(request, "You're text file has been imported")
            _read_file = [_map_file_to_model(row) for row in reader]
            _product_model = _read_file
            Product.objects.bulk_create([
                Product(**data) for data in _product_model
            ])
        form = QrImportForm()
        payload = {"form": form}
        return render(
            request, 'product/text_form.html', payload
        )

и полный Traceback

Traceback:

File "/home/copser/Documents/Project/qr-backend/venv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/copser/Documents/Project/qr-backend/venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/home/copser/Documents/Project/qr-backend/venv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/usr/local/lib/python3.7/contextlib.py" in inner
  74.                 return func(*args, **kwds)

File "/home/copser/Documents/Project/qr-backend/server/products/admin.py" in import_file
  36.             _read_file = [_map_file_to_model(row) for row in reader]

File "/home/copser/Documents/Project/qr-backend/server/products/admin.py" in <listcomp>
  36.             _read_file = [_map_file_to_model(row) for row in reader]

Exception Type: Error at /admin/products/product/import-file/
Exception Value: iterator should return strings, not bytes (did you open the file in text mode?)

Так может кто-нибудь, пожалуйста, помогите мне объяснить, что происходит, я все готов загрузить файл, поэтому нет необходимости делать whit open..., но все же.

1 Ответ

1 голос
/ 07 мая 2019

Ваш request.FILES['text_file'] является UploadedFile из django, а не из содержимого вашего файла.Вам нужно позвонить csv.reader(_file.read()), чтобы прочитать загруженный файл перед его разбором.

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