Django项目中views.py导入及路由配置相关问题求助
Django项目URL与视图配置问题排查
以下是你的配置中存在的多个问题,逐一梳理:
1. myapp/urls.py 配置错误
- 缺少视图导入:代码中使用了
views.home、views.predict等,但未添加from . import views语句,导致无法识别自定义视图。 - 错误放置admin路由:
path('admin/', admin.site.urls)应该放在项目根目录的urls.py中,而非app的urls文件里。
修正后的myapp/urls.py:
from django.urls import path from . import views urlpatterns = [ path("", views.home), path("predict/", views.predict), path("predict/result", views.result) ]
2. 项目根目录urls.py 配置错误
- 错误导入视图:
from django import views导入的是Django内置的views模块,并非你myapp中的自定义views,这会导致views.home等找不到对应函数。 - 未使用include关联app路由:正确的做法是通过
include将app的urls挂载到根路由,而非直接在根urls中重复定义app的路由。
修正后的根目录urls.py:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path("", include('myapp.urls')) # 将myapp的路由关联到根路径 ]
3. views.py 存在多处错误
- 缺少必要模块导入:代码中使用了
pd(pandas)、train_test_split、LogisticRegression、render,但未导入这些模块,运行时会抛出NameError。 - 请求参数获取错误:
request.Get应为大写的request.GET,Django中请求的GET参数是通过request.GET获取的。 - 模板名称错误:
render函数的第二个参数应为模板文件名(比如"result.html"),而非"predict",否则Django找不到对应的模板文件。 - 模型重复训练:每次请求
result视图时都会重新读取数据、训练模型,这会导致请求响应极慢,应该将模型训练代码移到视图外部,仅在项目启动时执行一次。 - 预测结果判断逻辑问题:
model.predict()返回的是numpy数组(如array([1])),直接和[1]或[0]比较会不匹配,应取数组第一个元素pared[0]进行判断。 - 缺少
home和predict视图:urls中定义了views.home和views.predict,但你的views.py中仅实现了result函数,这会导致访问对应路径时抛出视图未找到的错误。 - 预测输入数组格式问题:
model.predict([[val1, val2, ...]])中最后一个元素后多了一个逗号,虽然不影响运行,但属于冗余语法。
修正后的views.py示例(仅修复关键错误,需根据实际模板调整):
# 先导入所有必要模块 from django.shortcuts import render import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 提前训练模型,避免每次请求重复训练 data = pd.read_csv(r"C:\Users\user\Desktop\MAX\diabetes.csv") X = data.drop("Outcome", axis=1) Y = data['Outcome'] X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2) model = LogisticRegression(max_iter=1000) model.fit(X_train, Y_train) # 补充缺失的home视图 def home(request): return render(request, "home.html") # 补充缺失的predict视图(假设是展示输入表单的页面) def predict(request): return render(request, "predict.html") def result(request): # 修正GET参数获取方式 val1 = float(request.GET['n1']) val2 = float(request.GET['n2']) val3 = float(request.GET['n3']) val4 = float(request.GET['n4']) val5 = float(request.GET['n5']) val6 = float(request.GET['n6']) val7 = float(request.GET['n7']) val8 = float(request.GET['n8']) # 修正输入数组的冗余逗号 pared = model.predict([[val1, val2, val3, val4, val5, val6, val7, val8]]) result1 = "" # 修正结果判断逻辑,取数组第一个元素 if pared[0] == 1: result1 = "positive" elif pared[0] == 0: result1 = 'negative' # 修正模板名称,假设模板名为result.html return render(request, "result.html", {"result": result1})
额外注意事项
- 确保你在myapp目录下创建了
templates文件夹,并将home.html、predict.html、result.html等模板文件放入其中。 - 若使用的是Django 3.1及以上版本,确保
settings.py中TEMPLATES配置的APP_DIRS为True,这样Django会自动查找app下的templates文件夹。
内容的提问来源于stack exchange,提问作者Maxwell Oduor
相关产品推荐
相关产品推荐

