Нормализация окончаний строк 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,
}