2010-06-02 3 views
4

자주 사용하기 전에 일부 양식 데이터를 필터링해야합니다 (데이터베이스에 저장하는 등). 공백을 제거하고 반복 공백을 하나의 공백으로 대체하려고한다고 가정 해 봅니다. 텍스트 필드 중 많은 형태로 나타납니다. 그것은 clean_<fieldname> 방법을 사용하여이 작업을 수행하기 어렵지 않다 :Django : 양식 필드를 정리하고 코드 중복을 피하는 방법

# 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']) 

질문 : 장고의 모든 표준 및 간단한 방법 (이 (예를 들어, validators = {'title': my_text_filter, 'description': my_text_filter}MyModel에 추가하는 것과 같이) 또는 적어도 더 많거나 적은 표준 해결 방법을 사용하여이 작업을 수행하려면 버전 1.2를 사용하십시오. 설명서에서 폼 유효성 검사기와 유효성 검사기를 읽었지만 필요한 부분을 찾을 수 없습니다.

+1

당신이 대신 각 필드에 대해 하나를 작성하는 형태의'clean' mehod를 사용할 수 있습니다 한 번에 두 개 이상의 필드에 대한 뭔가를하려는 경우 ! –

답변

2

Django는 질문을 해결하기위한 기본 솔루션이 없으므로. 이 문제를 어떻게 해결할 수 있습니까? ModelForm에 decorator을 사용하라고 조언합니다. 여기 작업 코드 (또한 내가 로그인 사용하십시오 모듈) :

#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 
    ....... 
    ....... 
    ....... 
+0

아주 좋은 데코레이터 사용. 이것을 기억할 것입니다. –

관련 문제