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

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'

问题根源

  1. 路由配置错误:urls.py中直接调用类的方法(如views.Search.click_search_result),而非通过as_view()实例化类视图。Django会将request对象作为第一个参数传入这些方法,导致方法中的self实际是WSGIRequest实例,而非Search类的实例,因此访问self.request会报错。
  2. 类视图方法签名错误: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>&nbsp;&nbsp;&nbsp;&nbsp;<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:04:57