0

web2py 书中我们看到了这段代码

def first():
    form = SQLFORM.factory(Field('visitor_name', requires=IS_NOT_EMPTY()))
    if form.process().accepted:
        session.visitor_name = form.vars.visitor_name
        redirect(URL('second'))
    return dict(form=form)

在这样的模板中使用:

{{extend 'layout.html'}}
What is your name?
{{=form}}

问题就变成了:通常像字符串和数字这样的python值会在字典中传递给模板引擎。但是在这种情况下传递了什么以及允许它“展开”成 HTML 的 web2py 是什么?

我可以构建 DOM 树并传递它们吗?或者这只是一个大的转义字符串?

4

2 回答 2

2

在这种情况下,正在传递 FORM 对象(类)。FORM 是一个 gluon.html 对象,DIV、SPAN、P 等也是。它们都有一个名为“.xml”的方法,该方法将类“展开”为适当的 HTML 表示。

在 web2py 中,您可以在控制器末尾的 dict() 中传递任何对象,并在模板中使用它。因为 web2py 在模板中使用纯 python,所以您不必以任何方式确保您的对象是“支持”的,任何对象或原语都可以发送。但是,HTML 对象应该继承自所有 HTML 对象的基类,并且应该有一个代表该对象的 .xml() 方法。

dom tree假设您的意思是 HTML 片段(代码中的分层结构),您可以按照您的说法传递 a 。例如:

some_text = 'even variables'

x = DIV(
  A(IMG(_src='some-img.png'), _href='http://some.link.com/awdawd'),
  SPAN('Some text for whatever reason', _class='my-class', _some_other_html_attribute='i automatically get made into an attribute in the html, via gluonic magic'),
  DIV('I am text, because I am a div, any number of arguments can be combined', 'and displayed', some_text, **{'_data-special-attr':'even-html5-microdata-is-doable'}),
  UL(LI('lists are cool too'), LI('I guess')),
  TABLE([['some objects', 'are smart'], ['and you can pass them lists of lists'], ['and they know what to do with it']])
)

return dict(content=x)

完全有效并且会正确“展开”[假设我输入正确......]

更多信息,请访问 epydocs:http ://www.web2py.com/examples/static/epydoc/web2py.gluon.html.XmlComponent-class.html

我提到了“基础 HTML 类”——它实际上称为 XMLComponent。

这是选择类:

http://www.web2py.com/examples/static/epydoc/web2py.gluon.html.SELECT-class.html

于 2012-07-30T15:17:24.280 回答
1

Kasapo 提供了一个很好的解释。请注意,这一切都在在线文档中进行了解释——在Views章节中,请参阅HTML HelpersServer-side DOM部分。FORM对象作为助手的讨论出现在表单章节的开头(这里有一个表单 DOM 操作的示例)。

于 2012-07-30T15:29:04.023 回答