Django: как очистить поля формы и избежать дублирования кода - PullRequest
4 голосов
/ 02 июня 2010

Довольно часто мне нужно отфильтровать некоторые данные формы перед их использованием (сохранение в базе данных и т. Д.) Допустим, я хочу удалить пробелы и заменить повторяющиеся пробелы одним в большинстве текстовых полей во многих формах.Это не сложно сделать, используя 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), или хотя бы какой-то более или менее стандартный обходной путь?Я прочитал о проверке формы и валидаторах в документации, но не смог найти то, что мне нужно.

1 Ответ

2 голосов
/ 03 июня 2010

Насколько я знаю, у Django нет собственных решений для решения вашего вопроса. Я могу показать только, как я решаю эту проблему для себя. Я советую вам использовать декоратор для вас ModelForm. Вот рабочий код (, также я использую модуль регистрации ):

#DECORATOR
def applyValidators(model_form):
    def apply(*args,**kwargs):
        try:
            if hasattr(model_form.Meta.model,"validators"):
                for field_name,fnc in model_form.Meta.model.validators.items():
                    setattr(model_form,"clean_%s" % field_name,fnc)
        except Exception,err:
            logging.error(str(err))
        return model_form(*args,**kwargs)
    return apply

#VALIDATORS
def validator(*args,**kwargs):
    return "SOMEVALUE"

#MODEL
class MyModel(models.Model):
    #Your fields
    .......
    .......
    .......

    #VALIDATE DICT
    validators = {"username":validator,"email":validator}    

#MODEL FORM
@applyValidators
class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    .......
    .......
    .......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...