2013-05-08 19 views
6

私は初めてWTFormsを使用しています。 tonadoハンドラで 以下トルネード でPOSTリクエストを検証するWTFormsを使用して、私のフォームで forms.py竜巻とWTForms

class UserForm(Form): 
    user = TextField('user', [validators.Length(min=23, max=23)]) 

私は

def post(self): 
    form = UserForm(self.request.body) 

を持っている私が取得エラーメッセージは次のとおりです。 FORMDATAはする必要があります'getlist'メソッドをサポートするマルチディック型ラッパー "

どうすればこの仕事をすることができますか?

答えて

7

wtforms-竜巻トルネードのための0.0.1

WTForms拡張。

pip install wtforms-tornado 

WTForms-Tornado

2

TornadoフォームオブジェクトをWTFormsが予期しているものに変換できるオブジェクトが必要です。私はこれを使用します。

class TornadoFormMultiDict(object): 
"""Wrapper class to provide form values to wtforms.Form 

This class is tightly coupled to a request handler, and more importantly one of our BaseHandlers 
which has a 'context'. At least if you want to use the save/load functionality. 

Some of this more difficult that it otherwise seems like it should be because of nature 
of how tornado handles it's form input. 
""" 
def __init__(self, handler): 
    # We keep a weakref to prevent circular references 
    # This object is tightly coupled to the handler... which certainly isn't nice, but it's the 
    # way it's gonna have to be for now. 
    self.handler = weakref.ref(handler) 

@property 
def _arguments(self):   
    return self.handler().request.arguments 

def __iter__(self): 
    return iter(self._arguments) 

def __len__(self): 
    return len(self._arguments) 

def __contains__(self, name): 
    # We use request.arguments because get_arguments always returns a 
    # value regardless of the existence of the key. 
    return (name in self._arguments) 

def getlist(self, name): 
    # get_arguments by default strips whitespace from the input data, 
    # so we pass strip=False to stop that in case we need to validate 
    # on whitespace. 
    return self.handler().get_arguments(name, strip=False) 

def __getitem__(self, name): 
    return self.handler().get_argument(name) 

その後、あなたのベースハンドラで、あなたがような何かしたい:

self.form = TornadoFormMultiDict(self) 

注:私はこれがmailing list topic on this subjectから適応だと思うが。

0

私は私が期待しているかもしれないほど直感的WTFormsフォームで竜巻テンプレート内に含まれる基本的なHTMLフォームを置き換える見つけることができませんでした。ここで

wtforms-tornadoを使用して、非常に単純な形の例です:

テンプレート:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title>A Simple Form</title> 
    <meta name="description" content="Submit Track to Infinite Glitch"> 
</head> 
<body> 
<p><h1>Submit Info</h1></p> 
<form enctype="multipart/form-data" action="/simple" method="post"> 
{{ form.name }}<br/> 
{{ form.email }}<br/> 
{{ form.message }}<br/> 
<input type="submit"/> 
</form> 
</body> 
</html>  

アプリコード:

import wtforms 
from wtforms_tornado import Form 

class EasyForm(Form): 
      name = wtforms.TextField('name', validators=[wtforms.validators.DataRequired()], default=u'test') 
      email = wtforms.TextField('email', validators=[wtforms.validators.Email(), wtforms.validators.DataRequired()]) 
      message = wtforms.TextAreaField('message', validators=[wtforms.validators.DataRequired()]) 

class SimpleForm(tornado.web.RequestHandler): 
    def get(self): 
     form = EasyForm() 
     self.write(templates.load("simpleform.html").generate(compiled=compiled, form=form)) 

    def post(self): 
     form = EasyForm(self.request.arguments) 
     details = ''; 
     if form.validate(): 
      for f in self.request.arguments: 
       details += "<hr/>" + self.get_argument(f, default=None, strip=False) 
      self.write(details) 
     else: 
      self.set_status(400) 
      self.write(form.errors) 

if __name__ == "__main__": 

    application = tornado.web.Application(
     tornadio2.TornadioRouter(SocketConnection).apply_routes([ 
      (r"/simple", SimpleForm), 
     ]), 
    ) 

    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 
+0

こんにちは、あなたは自己 'から欠落している輸入を完了することができます.write(templates.load( "simpleform.html")generate(compiled = compiled、form = form)) 'これでコードは実行可能になりますか? – kardaj

+0

現時点ではトルネードは一切使用していないため、これをもう一度確認する必要があります。 – MikeiLL

関連する問題