I’m currently working in a django project in which I do some data analysis using pandas library and want to display the data (which is converted into a dictionary) as a HTML table.
dictionary that I want to display:
my_dict = { 'id': [1, 2, 3, 4, 5], 'product_name': [product1, product2, product3, product4, product5], 'value': [200, 400, 600, 800, 1000], 'available_qty': [1, 2, 3, 2, 4] }
I want to display the above dictionary like this table in django template.
id | product_name | value | available_qty |
---|---|---|---|
1 | product1 | 200 | 1 |
2 | product2 | 400 | 2 |
3 | product3 | 600 | 3 |
4 | product4 | 800 | 2 |
5 | product5 | 1000 | 4 |
I have tried the below code.
<table> <thead><h2><b>my dictionary</b></h2></thead> {% for key, values in my_dict.items %} <th><b>{{ key }}</b></th> {% for value in values %} <tr> {{value}} </tr> {% endfor %} {% endfor %} </table>
I get the results as,
(There is some space between each row displayed in the table)
Advertisement
Answer
Better first convert to list of rows (using zip()
) and send this to template
my_dict = { 'id': [1, 2, 3, 4, 5], 'product_name': ['product1', 'product2', 'product3', 'product4', 'product5'], 'value': [200, 400, 600, 800, 1000], 'available_qty': [1, 2, 3, 2, 4] } all_headers = list(my_dict.keys()) all_rows = list(zip(*my_dict.values())) print(all_headers) for row in all_rows: print(row)
Result:
['id', 'product_name', 'value', 'available_qty'] (1, 'product1', 200, 1) (2, 'product2', 400, 2) (3, 'product3', 600, 3) (4, 'product4', 800, 2) (5, 'product5', 1000, 4)
And then template could be (but I didn’t test it)
<h2>my dictionary</h2> <table> <thead> <tr> {% for header in all_headers %} <th>{{ header }}</th> {% endfor %} <tr> </thead> <tbody> {% for row in all_rows %} <tr> {% for value in row %} <td>{{ value }}</td> {% endfor %} <tr> {% endfor %} </tbody> </table>
EDIT:
If you use pandas
then you could use df.to_html()
to generate table
import pandas as pd df = pd.DataFrame(my_dict) html_table = df.to_html(index=False) print(html_table)
and it gives HTML similar to code from my previous template
<table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th>id</th> <th>product_name</th> <th>value</th> <th>available_qty</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>product1</td> <td>200</td> <td>1</td> </tr> <tr> <td>2</td> <td>product2</td> <td>400</td> <td>2</td> </tr> <tr> <td>3</td> <td>product3</td> <td>600</td> <td>3</td> </tr> <tr> <td>4</td> <td>product4</td> <td>800</td> <td>2</td> </tr> <tr> <td>5</td> <td>product5</td> <td>1000</td> <td>4</td> </tr> </tbody> </table>
And you can send html_table
to template and you have to display it with option safe
(so it will not convert <
>
to ≶
, >
)
{{ html_table | safe }}