在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树并传递它们吗?或者这只是一个很大的逃脱字符串?
答案 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 Helpers和Server-side DOM部分。 FORM
作为助手的{{1}}对象的讨论出现在Forms章的开头(并且有一个表格DOM操作的例子here)。