【问题标题】:Web2Py - rendering AJAX response as HTML tableWeb2Py - 将 AJAX 响应呈现为 HTML 表
【发布时间】:2015-07-23 00:35:59
【问题描述】:

我是 Python 堆栈 Web2Py 的新手。我有一个简单的要求来实现。我需要将一些数据从 UI 表单传递到 Controller 操作以进行处理。处理完数据后,该操作将响应返回给我需要在同一视图上呈现为 HTML 表的视图。为此,我正在使用 AJAX。

我能够将响应返回给视图,但不知道如何迭代该响应的元素以呈现为 HTML 表。当我运行下面的代码时,它所做的就是用响应内容替换整个目标 DIV。

我知道这在 Java、Grails、PHP 等中非常简单。但是,我正在努力在 Web2Py 中找到一种方法。

我的代码中有以下 sn-ps: index.html:

<script>
jQuery('#input_form').submit(function() {
    ajax('{{=URL('process_form')}}',
            ['input_var1','input_var2','input_var3','input_var4'], 'results_div');
    return false;
});

<div id="results_div">
    <form>
        <div class="table-responsive">
            <table id="records_table" class="table table-bordered">
                <tr>
                    <th>Col Head 1</th>
                    <th>Col Head 2</th>
                    <th>Col Head 3</th>
                    <th>Col Head 4</th>
                </tr>
                <tr>
                    <td>Col Content 11</td>
                    <td>Col Content 12</td>
                    <td>Col Content 13</td>
                    <td>Col Content 14</td>
                </tr>
                <tr>
                    <td>Col Content 21</td>
                    <td>Col Content 22</td>
                    <td>Col Content 23</td>
                    <td>Col Content 24</td>
                </tr>
            </table>
        </div>
    </form>
</div>

default.py

def process_form():
    results = request.vars
    return DIV(results)

在这方面的任何帮助将不胜感激。

【问题讨论】:

    标签: jquery html ajax web2py


    【解决方案1】:

    默认情况下,Ajax 函数期望接收 HTML,它将放置在传入 id 的元素内。因此,最简单的方法是让您的 process_form 函数返回表格的完整 HTML,所以results_div div 的内容将替换为新表。您可以使用 web2py HTML 帮助程序在 Python 中构建 HTML,也可以使用模板,就像任何其他控制器操作一样。例如:

    def process_form():
        inputs = ['input1', 'input2', 'input3']
        html = DIV(TABLE(THEAD(TR(TH('Column 1'), TH('Column 2'), TH('Column 3')),
                               _class='test', _id=0),
                         TR([request.vars[input] for input in inputs]),
                         _id='records_table', _class='table table-bordered'),
                   _class='table-responsive')
        return html
    

    或者,您可以让 process_form 函数返回 JSON 数据。在这种情况下,您可以将ajax() 的第三个参数设为 Javascript 函数,返回的 JSON 数据将传递给该函数。然后该函数可以使用新数据填充现有表。

    【讨论】:

    • 谢谢 Anthony,我想采用您提到的第一种方法:“您可以使用 web2py HTML 帮助程序在 Python 中构建 HTML,或者您可以使用模板,就像任何其他控制器操作一样”。您能否分享一个使用 Web2Py HTML 助手在 Python 中构建 HTML 的代码示例?
    • 太棒了!非常感谢安东尼为我指明了正确的方向。现在它变得更有意义了。但是,我对您生成 TABLE 的方式有点困惑。我无法理解您在html = DIV(TABLE(TR([request.vars[input] for input in inputs]), _id='records_table', _class='table table-bordered'), _class='table-responsive') 中使用的语法语义。我一直在尝试将其与以下所示的语法进行比较:link,即TABLE(*[TR(*rows) for rows in table])
    • 您还可以指导在表格顶部添加标题行吗?我如何在同一个表生成 HTML 中添加这种语句 THEAD(TR(TH('&lt;hello&gt;')), _class='test', _id=0)
    • TR 可以采用一组位置参数(每个参数都将被视为TR 的一个组件,因此包装在TD 中),或者它可以采用一个列表作为单个位置参数,它将列表中的每个项目视为一个组件(再次包装在 TD 中)。所以,如果你有一个列表,你可以选择TR(the_list)TR(*the_list)。后者就像您将每个列表项作为单独的位置参数传递一样(* 语法是 Python 参数解包语法——不特定于 TR 或 web2py)。
    • 关于表头,TABLE 就像任何其他助手一样,可以使用任意数量的组件作为位置参数,因此只需在 TR 对象之前插入您的 THEAD 对象(请注意,您应该确保THEAD 具有正确的列数)。我编辑了示例以显示这一点。
    猜你喜欢
    • 2018-10-31
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多