Flask:使Dataframe.to_html()行可点击

时间:2019-12-21 18:19:34

标签: python pandas flask jinja2

我有自动生成的数据帧,其中显示了一些数据。我想将每一行链接到带有某些作为参数发送的列的路由'/ row_details。

@app.route('/')
def index():
    df = get_df()
    return render_template('table.html',  tables=[df.to_html(classes='data')])

@app.route('/row_details')
def row_details():
    column1 = request.args.get('column1')
    column2 = request.args.get('column2')
    #do something with those columns

我想我可以为包含URL + GET参数的数据帧生成一个新列,但是有没有更好的方法可以使整个行都可点击?

模板的重要部分现在看起来像这样:

{% for table in tables %}
       {{ table|safe }}
{% endfor %}

1 个答案:

答案 0 :(得分:1)

如果要单独设置列格式-不将两个列中的值连接在一起-那么可以在formatters中使用to_html()

如果要将HTML放入列中,则还必须使用escape=False。通常,它将< >转换为&gt; &lt;

顺便说一句:我还必须设置'display.max_colwidth',因为它会截断列中的文本。

import pandas as pd

df = pd.DataFrame({'url':[
    'https://stackoverflow.com',
    'https://httpbin.org',
    'https://toscrape.com',
]})

pd.set_option('display.max_colwidth', -1)
result = df.to_html(formatters={'url':lambda x:f'<a href="{x}">{x}</a>'}, escape=False)

print(result)

结果:

<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>url</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td><a href="https://stackoverflow.com">https://stackoverflow.com</a></td>
    </tr>
    <tr>
      <th>1</th>
      <td><a href="https://httpbin.org">https://httpbin.org</a></td>
    </tr>
    <tr>
      <th>2</th>
      <td><a href="https://toscrape.com">https://toscrape.com</a></td>
    </tr>
  </tbody>
</table>

但是,如果要使用两列中的值创建链接,请在DataFrame中创建新列。

最终,您必须在模板中全部格式化(不使用to_html

df = pd.DataFrame({
    'url':[
        'https://stackoverflow.com',
        'https://httpbin.org',
        'https://toscrape.com',
    ],
    'name':[
        'Ask question',
        'Test requests',
        'Learn scraping'
    ]
})

<table>
{% for row in dt.iterrows() %}
    <tr><td><a href="{{ row['url'] }}">{{ row['name'] }}</a></td></tr>
{% endfor %}
</table>