【Django】”__init__() takes 1 positional argument but 2 were given”の対処法。

DjangoでAPIを作成していたら"init() takes 1 positional argument but 2 were given"というエラーが出てしまいました。

その際に解消できた対処法のメモです。

init() takes 1 positional argument but 2 were given

原因のコード

from django.urls import path, include
from .views import ArticleListView

urlpatterns = [
    path('articles/', IndexArticles, name='articles'),
]
class ArticleListView(generics.ListAPIView):
	queryset = Article.objects.all()
	serializer_class = ArticleSerializer
	permission_classes = (AllowAny,)

解決法 → urls.pyに.as_view()を記載する

urls.pyのに.as_view()を記載することで解消されました。

from django.urls import path, include
from .views import ArticleListView

urlpatterns = [
    path('articles/', IndexArticles.as_view(), name='articles'),  # 変更
]

“.as_view()”はどんな時に必要?

ビューには「関数ビュー」と「クラスビュー(class)」の2つがあり、クラスビューの場合は.as_view()の記載が必要なようです。

関数ビュー「.as_view()はいらない」

# 関数ビュー
def IndexView(request):
	
	params = {
		...,
	}
	return render(request, 'pages/index.html', params)
urlpatterns = [
    path('/', IndexView, name='index'),
    ...,
]

クラスビュー「.as_view()が必要」

# クラスビュー
class ArticleListView(generics.ListAPIView):
	queryset = Article.objects.all()
	serializer_class = ArticleSerializer
	permission_classes = (AllowAny,)
urlpatterns = [
    path('articles/', IndexArticles.as_view(), name='articles'),
    ...,
]

まとめ

ビューに「クラスビュー」と「関数ビュー」の2種類あるなんて知りませんでした…。

もっといろいろと触りながら少しずつDjangoの基本を探っていきたいなと思います!

コメントを残す

*