在django模板中显示django-pandas数据帧

Med*_*mer 18 django pandas

我正在尝试将django与pandas一起用于数据分析.似乎没有简单的分步教程.我在网上看到的所有内容都解释了如何在django views.py文件中编写代码,但没有一个显示如何在浏览器中显示最终产品.

这是我的views.py中的代码

def index2(request):
    qs = Product.objects.all()
    df = read_frame(qs)
    html= df.to_html
    return HttpResponse(html)
Run Code Online (Sandbox Code Playgroud)

但这不起作用.任何详细的帮助将不胜感激.请不要只指我一些文件.事实上,django的大部分文档都不是用简单的简单英语写成的 - 对我们中的一些人来说更令人困惑.谢谢.

Ste*_*e W 19

这是使用Django_Pandas和'扩展Bootstrap表'的最小但优雅的解决方案(https://github.com/wenzhixin/bootstrap-table)

优雅来自于将Pandas DataFrame导出为JSON以及Bootstrap Table脚本使用该JSON内容的能力.

HTML表是为我们编写的,我们不需要担心它(看下面我们只是包含'table'标签,而不是自己编写行,甚至是for循环.)它是交互式的.而Bootstrap让它看起来很漂亮.

要求:Bootstrap,JQuery,Django_Pandas,wenzhixin/bootstrap-table

models.py

from django.db import models
from django_pandas.managers import DataFrameManager

class Product(models.Model):
  product_name=models.TextField()
  objects = models.Manager()
  pdobjects = DataFrameManager()  # Pandas-Enabled Manager 
Run Code Online (Sandbox Code Playgroud)

views.py

from models import Product
def ProductView(request):
  qs = Product.pdobjects.all()  # Use the Pandas Manager
  df = qs.to_dataframe()
  template = 'product.html'

  #Format the column headers for the Bootstrap table, they're just a list of field names, 
  #duplicated and turned into dicts like this: {'field': 'foo', 'title: 'foo'}
  columns = [{'field': f, 'title': f} for f in Product._Meta.fields]
  #Write the DataFrame to JSON (as easy as can be)
  json = df.to_json(orient='records')  # output just the records (no fieldnames) as a collection of tuples
  #Proceed to create your context object containing the columns and the data
  context = {
             'data': json,
             'columns': columns
            }
  #And render it!
  return render(request, template, context)
Run Code Online (Sandbox Code Playgroud)

product.html

<script src='/path/to/bootstrap.js'>
<script src='/path/to/jquery.js'>
<script src='/path/to/bootstrap-table.js'>
<script src='/path/to/pandas_bootstrap_table.js'>
<table id='datatable'></table>
<!-- Yep, all you need is a properly identified
     but otherwise empty, table tag! -->
Run Code Online (Sandbox Code Playgroud)

pandas_bootstrap_table.js

$(function() {
  $('#datatable')({
    striped: true,
    pagination: true,
    showColumns: true,
    showToggle: true,
    showExport: true,
    sortable: true,
    paginationVAlign: 'both',
    pageSize: 25,
    pageList: [10, 25, 50, 100, 'ALL'],
    columns: {{ columns|safe }},  // here is where we use the column content from our Django View
    data: {{ data|safe }}, // here is where we use the data content from our Django View. we escape the content with the safe tag so the raw JSON isn't shown.
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 我没有编辑你的答案,因为你可能正在使用我不熟悉的功能,但我相信你的js语法应该是:$('#datatable.pandas').bootstrapTable({.那就是说,我不认为你使用的功能是在bootstrap中.有一个单独的添加名为bootstraptables,看起来有相同的语法? (2认同)
  • 如果我在视图中有数据框而不是在模型中,如何使用此方法? (2认同)

Ber*_*age 10

to_html是一个函数,您必须调用它

def index2(request):
    df = read_frame(Product.objects.all())
    return HttpResponse(df.to_html())
Run Code Online (Sandbox Code Playgroud)

  • @MehdiZare,您必须将安全过滤器添加到上下文中:```{{df|safe}}``` (2认同)