Нормализация окончаний строк CRLF во вводимых формах Django

У меня есть ModelForm с текстовой областью. Если пользователь вводит текст с новой строкой, браузер преобразует его в \r\n. Я бы ожидал, что Django нормализует этот текст для меня, но он этого не делает.

Это проблема, поскольку валидация maxlength в Django не соответствует maxlength в HTML, так как в браузере окончания строк воспринимаются только как "\n".

Так, если textarea имеет максимальную длину 5, и пользователь вводит "ab\ncd", он думает, что это нормально, но когда он отправляет форму, Django ошибается, потому что видит "ab\r\ncd", что составляет 6 символов. Я хочу исправить это, делая все с помощью \n, и не сохранять \r\n в базу данных.

Это можно сделать, переписав метод to_python для поля формы. Это выполняется как часть сериализации данных формы в python, так что это происходит до проверки или очистки поля (которая в противном случае может привести к ошибке из-за неправильной длины строки). Обратите внимание, что это отличается от перезаписи виджета (который управляет отображением формы в HTML) или поля модели (которое управляет хранением данных в базе данных).

from django.utils.text import normalize_newlines

class MyCharField(forms.CharField):
    def to_python(self, value):
        # NOTE: No security guarantees are made about this code
        return super().to_python(normalize_newlines(value))

А затем перезаписываем поле, используемое в форме, следующим образом:

class MyForm(forms.ModelForm):
    class Meta:
        widgets = {
            "text": forms.Textarea() # Unchanged
        }

        field_classes = {
            "text": MyCharField,
        }
Вернуться на верх