【问题标题】:How to print table using Jinja2 (without page refresh)如何使用 Jinja2 打印表格(不刷新页面)
【发布时间】:2023-03-16 11:54:02
【问题描述】:

我使用Pandas 从数据库中获取和转换一些数据,现在我想动态打印分数,即无需刷新页面。我已经尝试过:{{ mydata|safe}} 我得到了全部信息,但所有信息都没有放在表格中。

我使用 Pandas 从数据框 mydata.to_html()) 创建 HTML 表,我得到了类似的结果:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Part_number</th>
      <th>Type_name</th>
      <th>Short_desc</th>
      <th>Price_1</th>
      <th>Price_2</th>
      <th>VAT</th>
      <th>DB_source</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>565_MLNN7_101</td>
      <td>AIR_FILTER</td>
      <td>AIR_FILTER_GREEN</td>
      <td>1.20</td>
      <td>6.30</td>
      <td>23%</td>
      <td>Murexin</td>
    </tr>
    <tr>
      <th>1</th>
      <td>217_NE307_115</td>
      <td>CABLE</td>
      <td>CABLE_POWER_AC</td>
      <td>0.84</td>
      <td>3.20</td>
      <td>23%</td>
      <td>DB_1</td>
    </tr>
    </tr>
  </tbody>
</table>

你知道如何使用 Jinja2 打印表格吗?

【问题讨论】:

  • 可以分享一下你的渲染函数和html模板吗?

标签: python html flask datatables jinja2


【解决方案1】:

你需要的神社模板是这样的:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Part_number</th>
      <th>Type_name</th>
      <th>Short_desc</th>
      <th>Price_1</th>
      <th>Price_2</th>
      <th>VAT</th>
      <th>DB_source</th>
    </tr>
  </thead>
  <tbody>
      {% for row in mydata %}
          <tr> 
                <th>{{loop.index0}}</th>
                <td>{{row['Part_number']}}</td>
                <td>{{row['Type_name']}}</td>
                <td>{{row['Short_desc']}}</td>
                <td>{{row['Price_1']}}</td>
                <td>{{row['Price_2']}}</td>
                <td>{{row['VAT']}}</td>
                <td>{{row['DB_source']}}</td>
          </tr>
      {% endfor %}
  </tbody>
</table>

查看jinja2 documentation for more details

【讨论】:

  • 感谢您的帮助,但我得到了空表:(
  • @Szymon 在你的第一个例子中你写了mydata,而在第二个例子中只是data,请确保你在复制我的代码时使用了正确的。此外,根据数据类型,它可能是{{row['VAT']}}{{row.vat}}
  • 另外,你需要像@sweater-bacon 所说的那样使用 Ajax 来更新表格而不刷新页面,但我把这部分省略了,因为你主要是 jinja2 遇到问题。
  • 是的,你是对的,我的错。我介绍了一些更改:“data=mydata.to_html()”并作为返回函数“return render_template('search.html', form=form,data=data)”。现在我得到了很多行(超过 13k)的空表,但问题是 Jinja2,正如你所说。
  • 也许变量会导致问题?因为当只写“return mydata.to_html()”而不是“return render_template('search.html', form=form,data=data)”时,我得到了我想要的(包含整个分数的表格)但在新页面中。
【解决方案2】:

当然 这是我的 html 模板代码:

{% extends "header.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}

<div class="container">
<form class="form-signin" method="POST" action="/search">
    <div class="panel panel-default">
        <div class="panel-heading">Service Part Inquiry</div>
        <div class="panel-body">
{{ form.hidden_tag() }}
{{wtf.form_field(form.FGPN_Search)}}
{{wtf.form_field(form.AssyTypeName_Search)}}
{{wtf.form_field(form.Source_Search)}}

<button type="submit" class="btn btn-primary btn-xsy">Search</button>
 </div>
    </div>
</form>
</div> <!-- /container -->
    {{data|safe}}
    {% endblock %}

下面的函数代码。实际上我只检查“Source_Search”的条件:“Murexin”,这就是为什么我删除了一些代码(你会更容易理解:)我尊重你的时间):

    @app.route('/search',methods=['GET', 'POST'])
    def search():
        form = SearchForm()
        if request.method == 'POST':
            FGPN_Search = form.FGPN_Search.data
            AssyTypeName_Search = form.AssyTypeName_Search.data
            Source_Search = form.Source_Search.data
        (...)

            elif Source_Search == 'Murexin':
                if len(FGPN_Search)>1:
                    tablePLM=read_sql_query(select1 + "\'" + FGPN_Search + "\'" + select2 + "\'" + AssyTypeName_Search + "\'",CurDB_2)
                    tableSIC = read_sql_query(selectSIC + "\'" + FGPN_Search + "\'",CurDB_1)
                    mydata = pd.merge(tablePLM, tableSIC, on='PM_PARTNUMBER',how='outer')
                    mydata.to_html()        
                    return render_template('search.html', form=form,data=mydata)
            elif Source_Search == 'test':
                return "<h1>test</h1>"
            else:
                flash("Please write anything.")
                return render_template('search.html',form=form)
        return render_template('search.html', form=form)

【讨论】:

  • 你能解释一下你想在这里做什么吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2012-04-22
  • 2021-06-05
相关资源
最近更新 更多