2012-07-23 4 views
4

GET 및 POST 메서드가 모두 동일한 처리기 클래스에 있고 양식 유효성 검사 실패 후 사용자 입력으로 양식 필드를 채우려면 다음을 수행하십시오.WTForms : 게시물 값을 다시 게시 할 때

Class CommentHandler(BaseHandler): 
    def get(self, form=None): 
     if form is None: # create new form unless populated form is passed in 
      form = CommentForm() 
     # query DB and create template context 
     self.render('page.html', **context) 

    def post(self): 
     form = CommentForm(self.request.POST) 
     if form.validate(): 
      # populate entity with form data and save to DB 
      return self.redirect_to('page') 
     self.get(form=form) # pass populated form back to user for editing 

이것이 양식 데이터를 사용자에게 다시 돌려주는 가장 좋은 방법인지는 모르겠지만 작동하는 것으로 보입니다. 내 질문은 : GET 및 POST 메서드가 다른 처리기 클래스에있는 경우 해당 데이터를 폼으로 다시 전달하는 방법은 무엇입니까?

class PageHandler(BaseHandler): 
    def get(self): 
     # displays form to user 

class CommentHandler(BaseHandler): 
    def post(self): 
     # processes POSTed form data... 
     # but if form.validate() fails, 
     # how can I pass the form data back to the user 
     # so they can edit their form input? 

답변

0

다음은 문제 해결에 도움이되는 하나의 워크 플로입니다. 문제를 해결하기 위해 사용하는 기술이 너무 규범 적이 지 않도록 특정 코드 스 니펫 대신 워크 플로를 제공하기로했습니다.

GET 
if session contains form data: 
    add form data from session to template context 
display form 

POST 
if form validates: 
    clear this form data from session 
    save to db 
else: 
    save form data to session 
    redirect to GET handler 
1

당신이 postvalidate() WTForms를 호출 Form 인스턴스에 데이터를 인코딩 양식을 결합한다. http POSTGET과 같은 응답을 반환 할 수 있습니다. 따라서 서버 응용 프로그램의 유효성 검사에 실패하고 새로 고침을 시도 할 때 브라우저에서 이러한 재미있는 메시지가 표시되는 경우가 있습니다. 새로 고침 작업이 GET 처리 파이프 라인을 호출하고 POST 데이터를 잃어 버리기 때문입니다.

당신은 다시 그냥 돌아 응답에 바인드 된 데이터 Form 인스턴스를 전달하여 post 구현에서 응답을 렌더링하는 데 필요한 get 구현에 위임하는 대신해야 할 일은. 권장 방법으로 템플릿을 설정 한 경우 데이터가 해당 필드에 자동으로 표시됩니다. 다음은 Handler의 모습입니다. 물론

def post(self): 

    form = CommentForm(self.request.POST) 

    if form.validate(): 
     # populate entity with form data and save to DB 
     return self.redirect_to('page') 

    # If we are here it means we failed validation 
    # We need to send back the data the use supplied 
    # with error messages so we can re-render the form 
    # with their data and error messages indicating why 
    # it was rejected. 

    self.render('page.html', form=form) # pass populated form back to user for editing 

이것은 당신의 page.htmlForm 인스턴스와 무엇을 알고 있다고 가정합니다.