我有自动生成的数据帧,其中显示了一些数据。我想将每一行链接到带有某些作为参数发送的列的路由'/ 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 %}
答案 0 :(得分:1)
如果要单独设置列格式-不将两个列中的值连接在一起-那么可以在formatters
中使用to_html()
如果要将HTML放入列中,则还必须使用escape=False
。通常,它将< >
转换为> <
顺便说一句:我还必须设置'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>