从SQLFORM向web2py的模板系统传递了什么样的价值?

时间:2012-07-30 14:53:38

标签: web2py

the web2py book中,我们看到了此代码

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树并传递它们吗?或者这只是一个很大的逃脱字符串?

2 个答案:

答案 0 :(得分:2)

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

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

你可以传递一个dom tree,假设你的意思是一段HTML(代码中的层次结构)。例如:

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

答案 1 :(得分:1)

Kasapo提供了一个很好的解释。请注意,这些都在在线文档中进行了解释 - 在Views章节中,请参阅HTML HelpersServer-side DOM部分。 FORM作为助手的{{1}}对象的讨论出现在Forms章的开头(并且有一个表格DOM操作的例子here)。