class Form(Form):
def forms(self):
name = TextField('name', validators=[Required()])
class IndexHandler(tornado.web.RequestHandler):
def get(self):
form = Form()
self.render('index.html', form=form.forms())
模板:
<form method="post" action="/test">
{% raw form.name(type='text') %}
</form>
错误:
AttributeError:'NoneType'对象没有属性'name'
然而这可行,但我需要在类Form中的函数:
class Form(Form):
name = TextField('name', validators=[Required()])
class IndexHandler(tornado.web.RequestHandler):
def get(self):
form = Form()
self.render('index.html', form=form)
答案 0 :(得分:4)
您的forms()
方法不会返回任何内容:
class Form(Form):
def forms(self):
name = TextField('name', validators=[Required()])
默认情况下,在这种情况下返回None
。由于您将Form().forms()
的结果传递给了模板,因此最终会得到form=None
。
如果您需要在调用方法后在name
实例上设置Form
,请使用该方法执行此操作:
class Form(Form):
def forms(self):
name = TextField('name', validators=[Required()])
self.name = name.bind(form=self, name='name',
prefix=self._prefix,
translations=self._get_translations())
self._fields['name'] = self.name
self.process()
其中,对于wtforms
字段,您需要将字段绑定到表单,然后才能使用它。通常,框架会为您解决此问题。
然后单独调用该方法:
class IndexHandler(tornado.web.RequestHandler):
def get(self):
form = Form()
form.forms()
self.render('index.html', form=form)
答案 1 :(得分:1)
如果要设置实例变量,则必须使用self
。否则它只是一个局部变量,当函数结束时会消失。
def forms(self):
self.name = TextField('name', validators=[Required()])
答案 2 :(得分:1)
你需要一个带有name属性的Form对象。第二个版本有效,因为它创建了一个Form对象,其中一个类变量名为name。第一个版本没有,因为它返回一个字符串,其中包含form.forms()的结果,而不是对象本身。
你想要这个:
class Form(object):
def __init__(self):
self.name = TextField('name', validators=[Required()])
然后,使用与以前相同的表格:
self.render('index.html', form=form)
如果您稍后需要更改self.name,则添加一个再次执行上述操作的函数。