如何在Django的URL路径中调用DataLoad类的data_display方法?
问题解决方法
核心问题分析
你当前的代码存在两个关键错误:
- urls.py中直接调用
DataLoad.data_display(request)完全错误——request对象仅在请求到来时由Django生成,在urls模块启动阶段根本不存在,这样写会直接导致项目启动失败;而且即使能调用,也会在项目启动时就执行一次方法,而非每次请求触发执行。 DataLoad类没有继承Django的View基类,因此无法使用as_view()方法生成视图。
解决方案(针对当前代码的最简修改)
因为你的data_display方法并没有使用DataLoad类的实例属性(比如self.save_path或self.name_of_file),所以最直接的修改是将其改为静态方法,然后直接在urls中引用这个方法。
1. 修改views.py
给data_display方法添加@staticmethod装饰器,使其成为无需实例化即可调用的静态方法:
import os import pandas as pd import json from django.shortcuts import render class DataLoad: def __init__(self, save_path, name_of_file): self.save_path = save_path self.name_of_file = name_of_file def file_load(self): file_path = os.path.join(self.save_path, self.name_of_file + ".html") return file_path @staticmethod # 添加静态方法装饰器 def data_display(request, *args, **kwargs): df = pd.read_csv("/home/satyajit/Desktop/opensource/data/us_amz.csv", low_memory=False) json_records = df.reset_index().to_json(orient='records') data = json.loads(json_records) context = {'data': data} return render(request, "home/data_display.html", context)
2. 修改urls.py
直接将DataLoad.data_display作为视图函数传入path,不需要提前调用它:
from django.urls import path from apps.home.views import DataLoad urlpatterns = [ path('data_display', DataLoad.data_display, name='data_display'), ]
进阶方案(若后续需要使用类实例属性)
如果之后你需要在data_display中用到DataLoad的实例属性(比如调用self.file_load()),可以将DataLoad改为继承Django的View基类,重写get方法处理请求:
修改后的views.py
import os import pandas as pd import json from django.views import View from django.shortcuts import render class DataLoad(View): # 继承Django的View类 def __init__(self, save_path, name_of_file, **kwargs): super().__init__(**kwargs) # 必须调用父类的初始化方法 self.save_path = save_path self.name_of_file = name_of_file def file_load(self): file_path = os.path.join(self.save_path, self.name_of_file + ".html") return file_path def get(self, request, *args, **kwargs): # 重写get方法处理GET请求 # 这里可以调用self.file_load()等实例方法 df = pd.read_csv("/home/satyajit/Desktop/opensource/data/us_amz.csv", low_memory=False) json_records = df.reset_index().to_json(orient='records') data = json.loads(json_records) context = {'data': data} return render(request, "home/data_display.html", context)
对应的urls.py
使用as_view()时需传入DataLoad初始化所需的参数:
from django.urls import path from apps.home.views import DataLoad urlpatterns = [ path( 'data_display', DataLoad.as_view(save_path="你的保存路径", name_of_file="你的文件名"), name='data_display' ), ]
内容的提问来源于stack exchange,提问作者Satyajit Barik
相关产品推荐
相关产品推荐

