Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:如何清理表单字段并避免代码重复_Django_Django Forms_Filtering - Fatal编程技术网

Django:如何清理表单字段并避免代码重复

Django:如何清理表单字段并避免代码重复,django,django-forms,filtering,Django,Django Forms,Filtering,通常,在使用表单数据之前(保存到数据库等),我需要过滤一些表单数据。比方说,我希望在许多表单中,在大多数文本字段中剥离空白并用单个空白替换重复的空白。使用clean\方法执行此操作并不困难: # Simplified model with two text fields class MyModel(models.Model): title = models.CharField() description = models.CharField() # Model-based fo

通常,在使用表单数据之前(保存到数据库等),我需要过滤一些表单数据。比方说,我希望在许多表单中,在大多数文本字段中剥离空白并用单个空白替换重复的空白。使用
clean\方法执行此操作并不困难:

# 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())
它正是我所需要的,并且有一个我喜欢的很好的副作用:如果用户只输入空白,字段将被视为空的,因此无效(如果需要的话),我甚至不必抛出
验证错误

这里明显的问题是代码重复。即使我将为此创建一些函数,例如
my_text\u 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版)来实现这一点(例如,通过添加属性
验证器={'title':my_text_filter,'description':my_text_filter}
MyModel
),或者至少是一些或多或少的标准解决方法?我在文档中读过关于表单验证和验证器的内容,但在那里找不到我需要的内容。

据我所知,Django没有任何本机解决方案来解决您的问题。 我只能展示我自己如何解决这个问题。 我建议您使用模型表单。 这里是工作代码(我也使用日志模块):


如果您想同时为多个字段执行某些操作,可以使用表单的
clean
mehod,而不是为每个字段编写一个!装饰师的使用非常好。我会记住这一点。
#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
    .......
    .......
    .......