Django Administration Site. 'Удаление нескольких объектов' приводит к ValidationError
При попытке удалить несколько строк, которые имеют связь один к одному с двумя другими таблицами, я получил следующую ошибку:
['“March 21, 2022” value has an invalid date format. It must be in YYYY-MM-DD format.']
Модели устанавливаются следующим образом:
class Media(models.Model):
date = models.DateField(primary_key=True, unique=True)
received_url = models.CharField(max_length=200, blank=True, null=True)
class Api(models.Model):
media = models.OneToOneField(Media, on_delete=models.CASCADE)
request_url = models.CharField(max_length=200)
class Text(models.Model):
media = models.OneToOneField(Media, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
copyright = models.CharField(max_length=200, blank=True, null=True)
Я пытаюсь удалить элементы в Home ' My_App_Main ' Medias ' Delete multiple objects из Django administration site. Что представляет мне следующее:
Вы уверены?
Вы уверены, что хотите удалить выбранные медиафайлы? Все следующие объекты и связанные с ними элементы будут удалены:
Summary
Medias: 2
Apis: 2
Texts: 2
Объекты
Media: 2022-03-21
Api: 2022-03-21
Text: 2022-03-21
Media: 2022-03-20
Api: 2022-03-20
Text: 2022-03-20
Я затем нажимаю Да, я уверен
Который срабатывает, затем вызывает ошибку.
Проверив POST-запрос в сетевом журнале браузера, я заметил, что даты указаны в неправильном формате:
_selected_action […]
0 "March+21,+2022"
1 "March+20,+2022"
action "delete_selected"
post "yes"
Я пробовал и в Firefox, и в Chrome.
Проверяя данные из оболочки Django, ничего не выделяется как неправильное. Данные возвращаются, как и ожидалось:
>>> for field in Media.objects.all():
... print(f'{type(field.date)}({field.date})')
...
<class 'datetime.date'>(2022-03-21)
<class 'datetime.date'>(2022-03-20)
>>> for field in Text.objects.all():
... print(f'{type(field.media.date)}({field.media.date})')
...
<class 'datetime.date'>(2022-03-21)
<class 'datetime.date'>(2022-03-20)
>>> for field in Api.objects.all():
... print(f'{type(field.media.date)}({field.media.date})')
...
<class 'datetime.date'>(2022-03-21)
<class 'datetime.date'>(2022-03-20)
Мне кажется, что это может быть связано с тем, что административный сайт Django делает что-то странное с форматом даты? Или, возможно, проблема в настройках браузера по умолчанию? А может быть, мне нужно что-то установить в файле настроек Django? Если это так, то как можно изменить это поведение?
Ошибка в том виде, в котором она появляется в браузере:
ValidationError at /admin/my_app_main/media/
['“March 21, 2022” value has an invalid date format. It must be in YYYY-MM-DD format.']
Метод запроса: POST URL запроса: http://127.0.0.1:11111/admin/my_app_main/media/. Версия Django: 4.0.3 Тип исключения: ValidationError Значение исключения:
['“March 21, 2022” value has an invalid date format. It must be in YYYY-MM-DD format.']
Exception Location: /home/user/.pyenv/versions/my_app/lib/python3.8/site-packages/django/db/models/fields/init.py, строка 1370, in to_python Python Executable: /home/user/.pyenv/versions/my_app/bin/python Версия Python: 3.8.2 Путь к Python:
['/home/user/git/user/my_app',
'/home/user/git/user/my_app',
'/home/user/.vscode/extensions/ms-python.python-2022.2.1924087327/pythonFiles/lib/python/debugpy/_vendored/pydevd',
'/home/user/.pyenv/versions/3.8.2/lib/python38.zip',
'/home/user/.pyenv/versions/3.8.2/lib/python3.8',
'/home/user/.pyenv/versions/3.8.2/lib/python3.8/lib-dynload',
'/home/user/.pyenv/versions/my_app/lib/python3.8/site-packages',
'/home/user/git/user/my_app/apps']
Время сервера: Mon, 21 Mar 2022 14:40:59 +0000
Traceback:
Я бы рекомендовал не использовать DateField в качестве первичного ключа. Или есть какие-то причины делать это? Вы можете оставить unique=True в любом случае, если хотите проверить, что нет двух экземпляров с одинаковой датой.
class Media(models.Model):
date = models.DateField(unique=True)
received_url = models.CharField(max_length=200, blank=True, null=True)