【问题标题】:How can I solve this error [missing 1 required positional argument: 'request']?如何解决此错误 [缺少 1 个必需的位置参数:'request']?
【发布时间】:2020-03-29 04:21:01
【问题描述】:

当我尝试在 Django 项目中的 DetailView 类上使用会话时,出现错误并且由于缺少请求对象而无法正常工作。

那我该怎么办?

您介意告诉我应该如何解决这个问题吗?

提前谢谢你。


错误代码

TypeError at /detail/41/
check_session() missing 1 required positional argument: 'request'

views.py

class DetailView(LoginRequiredMixin, generic.DetailView):  
  model = sampleDB
  template_name = 'detail.html'

  def check_session(self, request):
      if not 'history' in request.session:
          request.session['history'] = {'user': self.request.user, 'id': self.kwargs['pk']}

  def get_context_data(self, **kwargs):
      self.check_session()
      context = super().get_context_data(**kwargs)
      return context

project/urls.py

from django.contrib import admin
from django.contrib.staticfiles.urls import static
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('main.urls')),
    path('accounts/', include('allauth.urls')),
]

app/urls.py

from django.urls import path
from . import views

app_name = 'app'
urlpatterns = [
    path('', views.WelcomeView.as_view(), name='welcome'),
    path('home/', views.HomeView.as_view(), name='home'),
    path('detail/<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('detail_edit/<int:pk>/', views.DetailEditView.as_view(), name='detail_edit'),
    path('resister_history/', views.ResisterHistoryView.as_view(), name='resister_history'),
    path('resister_vegetable/', views.ResisterVegetableView.as_view(), name='resister_vegetable'),
    path('delete/<int:pk>/', views.DeleteView.as_view(), name='delete'),
    path('inquiry_login/', views.InquiryLoginView.as_view(), name='inquiry_login'),
    path('inquiry/', views.InquiryView.as_view(), name='inquiry'),

    path('404/', views.Error404View.as_view(), name='404'),
    path('403/', views.Error403View.as_view(), name='403'),
    path('500/', views.Error500View.as_view(), name='500'),

]

开发环境

  • Python:3.7.5
  • Django:2.2.2

【问题讨论】:

  • 当您调用self.check_session() 时,您没有传递任何参数,尽管它需要一个。你应该给它什么?
  • self.check_session(self.request) 或修改你的函数,它不接受请求参数,因为它可以通过 self 获得
  • @C.Nivs,我想将请求传递给 check_session,但我不知道如何传递。
  • @iklinac,当我尝试使用 self.check_session(self.request) 时,我遇到了这个错误 [CustomUser 类型的对象不是 JSON 可序列化的]
  • @tio 请显示您的 URL 模式。可能,错误就在那里。

标签: python django python-3.x


【解决方案1】:

check_session() missing 1 required positional argument: 'request'

有时你会调用方法check_session()。方法check_session() 定义如下:

def check_session(self, request):

这意味着您指示该方法期望您像这样调用它: check_session(request=some_value) 而不是 check_session(some_value)

可以像check_session(some_value) 一样传递它,但是您必须遍历kwargs 才能找到您要查找的内容。但可读性较差,工作量较大。


早上喝咖啡后:

在views.py 中,您从get_context_data 调用self.check_session()check_session 期望传递给它的东西。你什么都没通过。

【讨论】:

  • 谢谢你的回答,我把代码改成了self.check_session(request=self.request)而不是self.check_session(self.request),但是还是有这样的错误代码[ TypeError at /detail/41/ CustomUser 类型的对象不是 JSON 可序列化的]
  • 什么? def check_session(self, request) 可以同时称为check_session(request=some_value) check_session(some_value)。该函数签名既不强制命名参数也不强制位置参数。
  • @tio 这不是同一个问题。
  • @deceze 你是对的。我不应该在喝咖啡之前说些什么
  • 我试图从 get_context_data 调用 self.check_session() 但我仍然有这样的错误代码。[ TypeError at /detail/41/ check_session() missing 1 required positional argument: 'request' ]
猜你喜欢
  • 2018-10-29
  • 2019-10-30
  • 1970-01-01
  • 2020-09-21
  • 2020-10-12
  • 2020-08-13
  • 1970-01-01
  • 2014-09-13
相关资源
最近更新 更多