Django报错:'WSGIRequest'对象无'request'属性,点击跳转异常
Django点击跳转查询数据库报错解决方案
问题
开发Django项目时,需实现点击网页元素获取值并从数据库查询结果的功能。页面按钮显示正常,但点击后触发错误:AttributeError: 'WSGIRequest' object has no attribute 'request',尝试为函数添加request参数未解决问题,需实现点击跳转并返回数据库数据的正确方案。
报错信息
Environment: Request Method: GET Request URL: http://127.0.0.1:8000/search/hsa-GFAP_0019/ Django Version: 4.2.1 Python Version: 3.9.12 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'search'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] Traceback (most recent call last): File "G:\my software\mydoc\python\pythonlist\venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) File "G:\my software\mydoc\python\pythonlist\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "G:\my software\mydoc\python\pythonlist\0.django_total\circRNA\search\views.py", line 70, in click_search_result return render(self.request, 'search_result.html', {'value_clicked': value_clicked, Exception Type: AttributeError at /search/hsa-GFAP_0019/ Exception Value: 'WSGIRequest' object has no attribute 'request'
问题根源
- 路由配置错误:
urls.py中直接调用类的方法(如views.Search.click_search_result),而非通过as_view()实例化类视图。Django会将request对象作为第一个参数传入这些方法,导致方法中的self实际是WSGIRequest实例,而非Search类的实例,因此访问self.request会报错。 - 类视图方法签名错误:
Search类的get方法未接收request参数,不符合Django View类的方法规范。
修复方案
1. 重构路由配置
将直接调用类方法的路由改为使用类视图的as_view()方法,拆分不同功能为独立类视图,提高代码可读性。
2. 修正类视图实现
确保类视图的HTTP方法(如get)接收request参数,正确处理请求和路由参数,并实现数据库查询逻辑。
完整修正代码
urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.HomePageView.as_view(), name='homepage'), path('download/', views.DownloadPage.as_view(), name='download'), path('contact/', views.Contact.as_view(), name='contact'), path('search/', views.Search.as_view(), name='search'), path('search/result/', views.SearchResultView.as_view(), name='search result'), path('search/<str:value_clicked>/', views.ClickSearchResultView.as_view(), name='click search result') ]
views.py
from django.views import View from django.shortcuts import render from .models import TestCircModels, GeneInfo from itertools import chain class Search(View): def get(self, request): # 处理初始搜索页面请求 return render(request, 'search_table.html') class SearchResultView(View): def get(self, request): # 处理关键词搜索请求 symbol = request.GET.get('symbol', '') interaction = [] count = 0 full_name = '' geneInfo = None if symbol: interaction1 = TestCircModels.objects.filter(symbol1__icontains=symbol) full_name_line = interaction1.first() if full_name_line: full_name = full_name_line.symbol1 interaction2 = TestCircModels.objects.filter(symbol2__icontains=symbol) interaction = list(chain(interaction1, interaction2)) count = len(interaction) # 查询基因详细信息 geneInfo = GeneInfo.objects.get(main_id=full_name) return render(request, 'search_table.html', { 'interaction': interaction, 'count': count, 'symbol': symbol, 'full_name': full_name, 'geneinfo': geneInfo, }) class ClickSearchResultView(View): def get(self, request, value_clicked): # 处理点击跳转后的数据库查询逻辑 # 示例:根据点击的value查询基因信息 gene_data = GeneInfo.objects.filter(main_id=value_clicked).first() return render(request, 'search_result.html', { 'value_clicked': value_clicked, 'gene_data': gene_data # 将查询结果传递给模板 })
HTML代码(可按需扩展)
<!-- 点击跳转的页面 --> <td><b>Gene name:</b> <a href="{% url 'click search result' value_clicked=full_name %} " style="color: #0f0f0f" id="{{ full_name }}">{{ full_name }}</a></td> <!-- 跳转后的结果页面 --> <div> <p>hello world</p> <p>hello world!!!!</p> {{ value_clicked }} <!-- 新增显示查询到的基因数据 --> {% if gene_data %} <p>基因ID: {{ gene_data.main_id }}</p> <!-- 其他字段根据实际模型添加 --> {% endif %} </div>
说明
- 拆分独立类视图后,每个视图专注处理单一功能,符合Django的MVC设计思想。
- 所有类视图的
get方法均接收request参数,self为类实例,可通过self.request访问请求对象(本次修复中直接使用传入的request参数更直观)。 - 在
ClickSearchResultView中添加了数据库查询逻辑,可根据实际需求扩展字段和查询条件。
内容的提问来源于stack exchange,提问作者yyzhang
相关产品推荐
相关产品推荐

