Django中如何将panddf的过滤后pandas df传入graphview生成饼图
实现方案
你不需要在两个视图函数之间传参,Django的视图函数都是独立的HTTP请求处理入口,直接参数传递不符合视图的设计逻辑,推荐两种实现方式:
方案1:直接把用户过滤逻辑整合到graphview中(最简便)
直接在graphview里获取当前登录用户,拉取过滤后的数据生成图表,不需要额外依赖panddf函数,同时修正你原代码里objects拼写错误的问题:
from django.http import JsonResponse from django.shortcuts import render from board.models import userboard from .utils import get_plot import pandas as pd from sqlalchemy import create_engine def graphview(request): # 先获取当前登录用户名 if not request.user.is_authenticated: # 未登录的情况可以按需求处理,比如跳转到登录页 return render(request, 'login.html') username = request.user.username # 拉取并过滤数据 engine = create_engine('postgresql+psycopg2://postgres:#24May@2002@localhost/bhavesh') df = pd.read_sql_query('SELECT * FROM public."board_userboard"', con=engine) df_filtered = df[df['User_name'] == username] # 从过滤后的df取x、y轴数据 x = df_filtered['Month'].tolist() y = df_filtered['Bp_Values'].tolist() chart = get_plot(x, y) return render(request, 'piechart.html', {'chart': chart}) # 如果不需要单独访问panddf对应的页面,这个函数可以直接删掉 def panddf(request): if not request.user.is_authenticated: return render(request, 'login.html') username = request.user.username engine=create_engine('postgresql+psycopg2://postgres:#24May@2002@localhost/bhavesh') df = pd.read_sql_query('SELECT * FROM public."board_userboard"',con=engine) df1 = df[df['User_name'] == username] return render(request, 'abc.html')
方案2:抽离公共过滤逻辑复用(适合两个页面都需要用到过滤后数据的场景)
如果你的panddf视图对应的页面也需要保留,就把数据过滤的逻辑抽成公共工具函数,两个视图都调用这个函数获取过滤后的df即可:
from django.http import JsonResponse from django.shortcuts import render from board.models import userboard from .utils import get_plot import pandas as pd from sqlalchemy import create_engine # 抽离的公共工具函数:传入用户名返回过滤后的df def get_filtered_userboard(username): engine = create_engine('postgresql+psycopg2://postgres:#24May@2002@localhost/bhavesh') df = pd.read_sql_query('SELECT * FROM public."board_userboard"', con=engine) return df[df['User_name'] == username] def graphview(request): if not request.user.is_authenticated: return render(request, 'login.html') df_filtered = get_filtered_userboard(request.user.username) x = df_filtered['Month'].tolist() y = df_filtered['Bp_Values'].tolist() chart = get_plot(x, y) return render(request, 'piechart.html', {'chart': chart}) def panddf(request): if not request.user.is_authenticated: return render(request, 'login.html') df1 = get_filtered_userboard(request.user.username) return render(request, 'abc.html')
补充说明
- 你原来的代码里SQL查询的
"是HTML转义字符,实际写在Python代码里要换成普通双引号 - 两种方案都默认做了未登录用户的拦截,你可以根据自己的业务需求调整未登录时的处理逻辑
内容的提问来源于stack exchange,提问作者Bhavesh R
相关产品推荐
相关产品推荐

