You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 02:06:02