Довольно часто мне нужно отфильтровать некоторые данные формы перед их использованием (сохранение в базе данных и т. Д.) Допустим, я хочу удалить пробелы и заменить повторяющиеся пробелы одним в большинстве текстовых полей во многих формах.Это не сложно сделать, используя clean_<fieldname>
методы:
# Simplified model with two text fields
class MyModel(models.Model):
title = models.CharField()
description = models.CharField()
# Model-based form
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_title(self):
title = self.cleaned_data['title']
return re.sub(r'\s{2,}', ' ', title.strip())
def clean_description(self):
description = self.cleaned_data['description']
return re.sub(r'\s{2,}', ' ', description.strip())
Он делает именно то, что мне нужно, и имеет приятный побочный эффект, который мне нравится: если пользователь вводит только пробелы, поле будет считаться пустыми, следовательно, недействительным (если это требуется), и мне даже не нужно бросать ValidationError
.
Очевидная проблема здесь - дублирование кода.Даже если я создам для этого какую-то функцию, скажем my_text_filter
, мне придется вызывать ее для каждого текстового поля во всех моих формах:
from myproject.filters import my_text_filter
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_title(self):
return my_text_filter(self.cleaned_data['title'])
def clean_description(self):
return my_text_filter(self.cleaned_data['description'])
Вопрос: есть ли какие-то стандартные и простыев Django (я использую версию 1.2, если это имеет значение), чтобы сделать это (например, добавив свойство validators = {'title': my_text_filter, 'description': my_text_filter}
к MyModel
), или хотя бы какой-то более или менее стандартный обходной путь?Я прочитал о проверке формы и валидаторах в документации, но не смог найти то, что мне нужно.