Проверка Django max_length для BinaryField вызывает ошибку KeyError при переводе __init__.pyPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Проверка Django max_length для BinaryField вызывает ошибку KeyError при переводе __init__.py

Сообщение Anonymous »

У меня есть простая модель, что-то вроде

Код: Выделить всё

class Notenbild(models.Model):
bild_data = models.BinaryField(max_length=500000, editable=True)
В admin.py

Код: Выделить всё

class BinaryFieldWithUpload(forms.FileField):
def __init__(self, *, max_length=None, allow_empty_file=False, **kwargs):
super().__init__(max_length=max_length, allow_empty_file=allow_empty_file, **kwargs)

def to_python(self, data):
data = super().to_python(data)
if data:
image = Image.open(data)
# some more processing with the image which I omitted here
byte_array = io.BytesIO()
image.save(byte_array, format='PNG')
return byte_array.getvalue()
return None

def widget_attrs(self, widget):
attrs = super().widget_attrs(widget)
if isinstance(widget, FileInput) and "accept" not in widget.attrs:
attrs.setdefault("accept", "image/*")
return attrs

@admin.register(Notenbild)
class NotenbildAdmin(admin.ModelAdmin):
fields = [
'bild_data',
'vorschau',
]
readonly_fields = ['vorschau']

formfield_overrides = {
models.BinaryField: {'form_class': BinaryFieldWithUpload},
}

@admin.display(description='Bild (Vorschau)')
def vorschau(self, notenbild: Notenbild):
encoded_image = base64.b64encode(notenbild.bild_data).decode('utf-8')
return format_html(
f'{len(notenbild.bild_data)} bytes
'
f'
[img]data:image/png;base64,{encoded_image}[/img]
'
)
который отлично подходит для сохранения изображений через интерфейс администратора, соответствующих ограничениям по размеру. Однако при попытке сохранить файл, размер которого превышает ограничение, я получаю очень странную ошибку:

Код: Выделить всё

KeyError at /admin/library/notenbild/368/change/
"Your dictionary lacks key 'max'.  Please provide it, because it is required to determine whether string is singular or plural."

Django Version: 5.1.1
Exception Location: /Users/alex/Repositories/ekd-cms/venv/lib/python3.12/site-packages/django/utils/translation/__init__.py, line 130, in _get_number_value
что представляет собой полная трассировка стека

Код: Выделить всё

Traceback (most recent call last):
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/utils/translation/__init__.py", line 128, in _get_number_value
return values[number]
^^^^^^^^^^^^^^

During handling of the above exception ('max'), another exception occurred:
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/debug_toolbar/middleware.py", line 92, in __call__
panel.generate_stats(request, response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/debug_toolbar/panels/templates/panel.py", line 201, in generate_stats
template_data["context_list"] = self.process_context_list(

File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/debug_toolbar/panels/templates/panel.py", line 134, in process_context_list
if key_values == context_layer:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/forms/utils.py", line 192, in __eq__
return list(self) == other
^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/forms/utils.py", line 192, in __eq__
return list(self) == other
^^^^^^^^^^
File "", line 1026, in __iter__

^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/forms/utils.py", line 197, in __getitem__
return next(iter(error))
^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/core/exceptions.py", line 210, in __iter__
message %= error.params
^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/utils/functional.py", line 167, in __mod__
return self.__cast() % other
^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/utils/translation/__init__.py", line 148, in __mod__
number_value = self._get_number_value(rhs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/alex/Repositories/my-project/venv/lib/python3.12/site-packages/django/utils/translation/__init__.py", line 130, in _get_number_value
raise KeyError(
^
что для меня не имеет никакого смысла. Проверка правильно обнаружила недопустимые данные, но похоже, что это ошибка в Django? Или я использую эту штуку неправильно?
Я попробовал добавить в модель свой собственный валидатор:

Код: Выделить всё

from django.core.validators import BaseValidator
from django.utils.deconstruct import deconstructible
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ValidationError

@deconstructible
class MaxFileSizeValidator(BaseValidator):
message = _("Ensure the file is less than or equal to %(limit_value)s.")
code = "limit_value"

def __init__(self, limit_value, message=None):
super().__init__(limit_value, message)
self.limit_value = limit_value
if message:
self.message = message

def __call__(self, value):
cleaned = self.clean(value)
limit_value = (
self.limit_value() if callable(self.limit_value) else self.limit_value
)
params = {"limit_value": limit_value, "show_value": cleaned, "value": value}
if self.compare(cleaned, limit_value):
raise ValidationError(self.message, code=self.code, params=params)

def compare(self, a, b):
return len(a) > b
и

Код: Выделить всё

class Notenbild(models.Model):
bild_data = models.BinaryField(max_length=500000, editable=True, validators=[MaxFileSizeValidator(500000)])

но что бы я ни пытался, метод перевода __init__.py продолжает выдавать эту ошибку, что для меня не имеет особого смысла. Есть идеи?


Подробнее здесь: https://stackoverflow.com/questions/790 ... slation-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Разъяснение по поводу `length = prefixTable[length - 1]` и `length = length - 1` в алгоритме KMP.
    Anonymous » » в форуме JAVA
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Разъяснение по поводу `length = prefixTable[length - 1]` и `length = length - 1` в алгоритме KMP.
    Anonymous » » в форуме JAVA
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Разъяснение по поводу `length = prefixTable[length - 1]` и `length = length - 1` в алгоритме KMP.
    Anonymous » » в форуме JAVA
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Как загрузить файлы в BinaryField с помощью виджета FileField в администраторе Django?
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Есть ли какое-либо преимущество у int i = array.length перед двойным вызовом array.length?
    Anonymous » » в форуме JAVA
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»