在web2py中使用HTML帮助程序构建HTML标记有什么好处?

时间:2011-11-11 08:40:53

标签: markup web2py

我想了解在web2py中使用HTML帮助程序而不是纯HTML标记元素的好处。例如,我在web2py应用程序(reddish)中阅读了以下HTML标记构建器代码:

{{=A(IMG(_src=URL(r=request,c='static',f='up.png')),_href=URL(r=request,f='vote',args=['up',item.id]))}}

通过纯HTML标记编写此代码会产生以下结果:

<a href="/reddish/default/vote/up/{{=item.id}}"><img src="/reddish/static/up.png"/></a>

我发现简单的HTML标记更容易阅读。但我想了解使用HTML帮助程序是否有任何好处?

顺便说一句,我第一眼看到的一个好处就是HTML帮助程序代码不需要明确地编写应用程序的名称,即reddish。除此之外,使用HTML帮助程序还有其他好处吗?

1 个答案:

答案 0 :(得分:19)

首先,即使在你的第二个例子中,你应该这样做:

<a href="{{=URL('vote', args=['up', item.id])}}">
<img src="{{=URL('static', 'up.png')}}"/></a>

始终使用URL()帮助程序来编写URL,即使在视图中也是如此。它处理传出的重写,它知道当前的应用程序(和控制器),因此您不必包含那些(这意味着如果您更改其名称,所有URL仍然有效)。此外,我们不再需要指定request或使用cf关键字(reddish是旧应用)。

关于帮助程序,一般的经验法则是在需要在控制器,模型或模块中创建或操作HTML时使用它们,但要使用常规HTML标记(与Python混合使用,如第二个示例中所示)在意见中。但是,一个例外是当您需要在视图中构建复杂的HTML结构时。在这种情况下,在单个Python代码块中操作帮助程序可能更容易,而不是将常规HTML标记与Python混合。例如,如果您在字典列表中有数据(键'f1','f2','f3')并且想要创建HTML表格,您可以这样做:

{{=TABLE([TR(row['f1'], row['f2'], row['f3']) for row in rows])}}

你可以做同样的事情混合HTML和Python,但它会更长,更混乱。

帮助程序的另一个主要好处是它们创建了一个可以在Python代码中操作的server-side DOM。您最有可能在模型/控制器代码中创建的帮助程序是表单(通过FORM,SQLFORM,Crud和Auth系统)和表(通过SQLTABLE,SQLFORM.grid和Crud)。这些帮助程序本身包含其他帮助程序,例如表,div和ul,在序列化为HTML(for example)之前,它们可以在服务器端进行操作。

此外,一些帮助程序具有增加功能或使其更易于使用的特殊功能:

  • A:与<a></a>相同,但也需要特殊参数来处理Ajax回调。
  • HTML:自动添加doctype字符串。
  • INPUTOPTION:使用特殊value参数设置当前值,并自动分别设置checkedselected属性。
  • OLULSELECTTRTBODY:与他们的HTML对应物一样,除了它们会自动转换未命名的参数(或列表/元组)不是相应子元素的帮助者(分别是<li><option><td><tr>。 (上面的表格示例使用了这一事实 - TR()会自动将各个元素转换为单独的TD。)

最后,有许多帮助器具有专门的功能:

  • BEAUTIFY:构建复合对象的HTML表示。
  • CODE<pre></pre>的替代方案,可自动处理多种编程语言的代码突出显示和行号。
  • MARKMIN:将markmin代码转换为HTML。
  • MENU:从嵌套的元组列表中创建嵌套的ul。
  • TAG:通用代码生成器和HTML解析器。
  • XML:封装不应转义或应进行清理的文字。

有关详细信息,请参阅helpers documentation