Django 'on_upload' ошибка кириллицы - PullRequest
1 голос
/ 25 сентября 2019

У меня есть модель книги в models.py, которая содержит заголовок CharField:

title = models.CharField(
    verbose_name = "Название книги",
    max_length = 75,
    null = False,
    unique = True
    )

Также я использую django-model-utils для отслеживания этого, и другие поля изменяются.

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

'locale' codec can't encode character '\u041a' in position 0: encoding error

Боюсь, что если я что-нибудь наберув других полях этой модели на кириллице она выдает ту же ошибку.


Кроме того, в моем models.py у меня есть модель для Author с 1 полем:
author = models.CharField(max_length=80, null=False)

Но в этом случае у меня нет ошибки.Я думаю, что это проблема django-model-utils.


UPD 1:

трассировка ошибок

Environment:


Request Method: POST
Request URL: http://localhost:8000/admin/library/book/add/

Django Version: 2.2.5
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'library.apps.LibraryConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\options.py" in wrapper
  606.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\sites.py" in inner
  223.             return view(request, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\options.py" in add_view
  1634.         return self.changeform_view(request, None, form_url, extra_context)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\utils\decorators.py" in _wrapper
  45.         return bound_method(*args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\utils\decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\options.py" in changeform_view
  1522.             return self._changeform_view(request, object_id, form_url, extra_context)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\options.py" in _changeform_view
  1561.                 self.save_model(request, new_object, form, not add)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\contrib\admin\options.py" in save_model
  1088.         obj.save()

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\model_utils\tracker.py" in save
  243.             ret = original_save(instance, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\model_utils\tracker.py" in save
  243.             ret = original_save(instance, *args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\base.py" in save
  741.                        force_update=force_update, update_fields=update_fields)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\base.py" in save_base
  779.                 force_update, using, update_fields,

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\base.py" in _save_table
  870.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\base.py" in _do_insert
  908.                                using=using, raw=raw)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\query.py" in _insert
  1186.         return query.get_compiler(using=using).execute_sql(return_id)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
  1334.             for sql, params in self.as_sql():

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\sql\compiler.py" in as_sql
  1278.                 for obj in self.query.objs

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1278.                 for obj in self.query.objs

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\sql\compiler.py" in <listcomp>
  1277.                 [self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\sql\compiler.py" in pre_save_val
  1228.         return field.pre_save(obj, add=True)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\fields\files.py" in pre_save
  288.             file.save(file.name, file.file, save=False)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\fields\files.py" in save
  86.         name = self.field.generate_filename(self.instance, name)

File "c:\Users\yuyuko\Documents\dev\project3\env\lib\site-packages\django\db\models\fields\files.py" in generate_filename
  305.             dirname = datetime.datetime.now().strftime(self.upload_to)

Exception Type: UnicodeEncodeError at /admin/library/book/add/
Exception Value: 'locale' codec can't encode character '\u041a' in position 0: encoding error

UPD 2:

Я заметил, что если я создаю запись только на английском языке, она не выдает этозакодировать ошибку.И, если я переименую эту книгу позже в кириллицу, она также не выдаст мне ошибку.Таким образом, я получаю эту ошибку только при model create.Кто-нибудь говорит, что я могу с ним сделать?

UPD 3:

Итак, я решил заглянуть внутрь файла ...\django\db\models\fields\files.py и нашел функцию, которая выдает мне ошибку.Имя функции: generate_filename.

Из документации по этой функции

Применить (если возможно) или добавить (если строка) upload_to к имени файла ...

Я думаю, что было бы неплохо вставить try except, и, в конце концов, меня это обошло.Моя отредактированная часть этой функции выглядит следующим образом:

try:
    dirname = datetime.datetime.now().strftime(self.upload_to)
except UnicodeEncodeError:
    dirname = self.upload_to

Если кто-то много понимал Django, это изменение что-нибудь сломает?И как теперь мне следует реализовать это изменение в файле моего проекта, а не в Django от Venv?

UPD 4:

В начале этого вопроса я думаю, что проблема в django-model-utils Теперь, когда я редактировал исходный код Django, я думаю, что это проблема Django.

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