AttributeError:'NoneType'对象没有属性'name'

时间:2013-10-24 14:18:33

标签: python tornado wtforms

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)

3 个答案:

答案 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,则添加一个再次执行上述操作的函数。