首先,即使在您的第二个示例中,您也应该执行以下操作:
<a href="{{=URL('vote', args=['up', item.id])}}">
<img src="{{=URL('static', 'up.png')}}"/></a>
即使在视图中,编写URL时也要始终使用URL()
助手程序。它处理出站重写,并知道当前应用程序(和控制器),因此您不必包括它们(这意味着如果您更改它们的名称,则所有URL仍将起作用)。此外,现在不再需要指定request
或使用c
和f
关键字(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 混合编写相同的内容,但这样会变得更冗长和混乱。
另一个主要优点是辅助函数会创建
服务器端 DOM,可以在 Python 代码中进行操作。在模型/控制器代码中最有可能创建的辅助函数是表单(通过 FORM、SQLFORM、Crud 和 Auth 系统)和表格(通过 SQLTABLE、SQLFORM.grid 和 Crud)。这些辅助函数本身包含其他辅助函数,例如表格、div 和 ul,并且可以在服务器端进行操作,然后再序列化为 HTML(
例如)。
此外,一些辅助函数具有特殊功能,可以增加功能或使它们更易于使用:
A
:与<a></a>
相同,但还需要特殊参数来处理Ajax回调。
HTML
:自动添加doctype字符串。
INPUT
、OPTION
:采用特殊的value
参数来设置当前值,并自动处理设置checked
和selected
属性。
OL
、UL
、SELECT
、TR
、TBODY
:与它们的HTML对应项类似,除了它们会自动将未命名的参数(或列表/元组的元素)转换为相应的子元素(即<li>
,<option>
,<td>
和<tr>
)。 (上面的表格示例利用了这一事实--TR()
自动将单独的元素转换为单独的TD
。)
最后,有许多具有专门功能的辅助工具:
BEAUTIFY
: 构建复合对象的HTML表示。
CODE
: 替代<pre></ pre>
,自动处理几种编程语言的代码高亮和行号。
MARKMIN
: 将markmin代码转换为HTML。
MENU
: 从嵌套的元组列表创建嵌套的ul。
TAG
: 通用标签生成器和HTML解析器。
XML
: 封装不应该被转义或应该被清理的文本。
有关更多详细信息,请参见helpers documentation。