2013-01-21 2 views
5

나는 wtforms 형태를 이름 필드의wtforms SelectField 선택 확인을 어떻게 비활성화 할 수 있습니까?

class MyForm(Form): 
    names = SelectField('name', choices=[]) 

선택 사항 동적으로 구축하고 아약스 호출에 의해 템플릿에 렌더링이있다. 양식을 제출하면 "유효한 선택이 아님"예외가 발생합니다. 양식이 나를 위해 이름 필드의 유효성을 검사하는 것을 원하지 않습니다. 유효성 검사를 비활성화하려면 어떻게해야합니까? 으로

+0

왜 선택 매개 변수를 추가합니까? 왜'names = SelectField ('name')'아닌가? –

답변

1

"나는 선택의 유효성을 검사 할 수있는 양식을 원하지 않는다", 나는 당신이 실제로 의미 가정 "나는 나중에 나 자신을 할거야과 제대로 할 수있는 형태의 능력을 의심".

하지만 운이 좋다! 기존 양식을 서브 클래스 화하여 선택 사항을 동적으로 추가 할 수 있습니다.

class MyForm(Form): 
    # other fields... 


def some_handler(request): 
    name_choices = build_name_choices() 
    class RealForm(MyForm): 
     names = SelectField('name', choices=name_choices) 

    form = RealForm(request.GET) 
    form.validate() 

이 또한 나중에 자신을 생성하는 것과 형태의 검증 및 오류 메시지를 병합의 지루함에서 당신을 저장합니다.

+2

작성자의 질문을 자신의 것으로 대체하고 대답했습니다. 나는이 필요 또한 가지고 있고 그것은 여전히 ​​잘못된 가정이다. 내 필요는 클라이언트에서 동적으로 추가 된 공개 선택 사항을 가지므로 서버에서 알 수 없습니다. – Xealot

8

나는 WTForms에서 SelectMultipleField 유효성 검사를 수행하기 위해 이렇게했습니다. 그것은 단순히 내장 된 유효성 검사를 오버라이드 (override) 일반 SelectField

class NonValidatingSelectMultipleField(SelectMultipleField): 
    """ 
    Attempt to make an open ended select multiple field that can accept dynamic 
    choices added by the browser. 
    """ 
    def pre_validate(self, form): 
     pass 

와 동일한 방식으로 작동합니다.

+0

이것은 정확하게 맞습니다. 관심있는 사람이 있다면 건너 뛸 pre_validate 코드는 다음과 같습니다. –

+0

정상적인 SelectField에 해당하는 코드입니다. 다음은 SelectMultipleFIeld입니다. def pre_validate (self, form) : if self.data : values ​​= list (self.choices의 c에 대해 c [0]) for self.data : d 값이없는 경우 : raise ValueError (self.gettext (" '% (value) s'은 (는)이 필드에 유효한 선택이 아닙니다.) % dict (value = d)) –