TypeError: __init__() 接受 1 个位置参数,但给出了 2 个

Posted

技术标签:

【中文标题】TypeError: __init__() 接受 1 个位置参数,但给出了 2 个【英文标题】:TypeError: __init__() takes 1 positional argument but 2 were given 【发布时间】:2017-04-22 00:55:22 【问题描述】:

我正在使用 Django 1.10 开发一个简单的 rest api 当我运行我的服务器并调用应用程序 url 时,我收到一个错误:

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个

GET /demo/HTTP/1.1" 500 64736

追溯

Environment:
Request Method: GET
Request URL: http://localhost:8000/demo/

Django Version: 1.10.4
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'mydemoapp',
 'rest_framework']
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:

    File "/home/aqib/DjangoProject/mydemoenv/lib/python3.5/site-    packages/django/core/handlers/exception.py" in inner
    39. response = get_response(request)

    File "/home/aqib/DjangoProject/mydemoenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response 
    187. response = self.process_exception_by_middleware(e, request)

    File "/home/aqib/DjangoProject/mydemoenv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
    185. response = wrapped_callback(request, *callback_args, **callback_kwargs)

    Exception Type: TypeError at /demo/
    Exception Value: __init__() takes 1 positional argument but 2 were given

models.py

from django.db import models

class ProfileModel(models.Model):
    name = models.CharField(max_length=30, blank=False, default='Your Name')
    address = models.CharField(max_length=100, blank=True)
    contact = models.IntegerField()

    def __str__(self):
        return '%s %s' % (self.name, self.address)

views.py

from django.shortcuts import render
from rest_framework import viewsets
from mydemoapp.models import ProfileModel
from .serializers import ProfileSerializer

class ProfileView(viewsets.ModelViewSet):
    profile = ProfileModel.objects.all()
    serializer_class = ProfileSerializer

serializers.py

from .models import ProfileModel
from rest_framework import serializers

class ProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = ProfileModel
        fields = ('name', 'address', 'contact')

urls.py(应用程序网址)

from django.conf.urls import url
from mydemoapp import views

urlpatterns = [
url(r'^$', views.ProfileView),
]

urls.py(项目网址)

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^demo/', include('mydemoapp.urls')),
]

【问题讨论】:

使用 Django 有什么理由吗?对于一个简单的 REST API 来说似乎太过分了 能否有更完整的回溯/示例?这是什么时候执行的?什么文件?接到什么电话? @cricket_007 不相关,但并非不真实。 @MohdAqib 这几乎没有更多信息。是否引发或处理异常?你用过调试器吗? 你必须显示完整的回溯 【参考方案1】:

我经常犯这个非常愚蠢的错误。这是因为 urls.py(Application)。 永远记得调用.as_view()方法

错误

urls.py

from django.conf.urls import url
from mydemoapp import views

urlpatterns = [
url(r'^$', views.ProfileView),
]

正确

urls.py

from django.conf.urls import url
from mydemoapp import views

urlpatterns = [
url(r'^$', views.ProfileView.as_view()),
]

【讨论】:

3 年后,在 Django 3.0 中,这救了我。我很难理解为什么需要.as_view()。在我的情况下,我正在使用 django rest,并且我希望端点运行内部操作,而不仅仅是提供或修改数据。 ModelViewSet 不需要 .as_view() 才能工作,但 APIView 需要。我假设这只是抽象设置了一个奇怪的先例? @trevdev 因为 Django 的 URL 解析器希望将请求和相关参数发送到可调用函数,而不是类,所以基于类的视图有一个 as_view() 类方法,它返回一个可以调用的函数当请求到达与关联模式匹配的 URL 时。更多详情请看这里docs.djangoproject.com/en/3.1/topics/class-based-views/intro/…【参考方案2】:

您使用的ViewSet 网址错误。这是正确的方法

# project/urls.py
from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from mydemoapp import views

router = routers.DefaultRouter()

router.register(r'demo', views.ProfileView)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include(router.urls)),
]

阅读更多http://www.django-rest-framework.org/api-guide/routers/

回复评论

现在我得到 AssertionError: base_name 参数未指定,并且无法从视图集中自动确定名称,因为它没有 .queryset 属性。

你的观点也不正确。它应该指定queryset 而不是profile

class ProfileView(viewsets.ModelViewSet):
    queryset = ProfileModel.objects.all()  # <-- here 
    serializer_class = ProfileSerializer

【讨论】:

以上是关于TypeError: __init__() 接受 1 个位置参数,但给出了 2 个的主要内容,如果未能解决你的问题,请参考以下文章

TypeError: __init__() 接受 1 个位置参数,但给出了 3 个

TypeError: module.__init__() 最多接受 2 个参数(给定 3 个)

图表类:TypeError:__init__() 接受 1 个位置参数,但给出了 3 个

TypeError: __init__() 接受 2 个位置参数,但给出了 3 个 // 链接列表 [重复]

TypeError: __init__() 得到了一个意外的关键字参数“评分”

PyTorch - TypeError: forward() 接受 1 个位置参数,但给出了 2 个