3

I was using routers for creating urls now i want to make urls for my api, but problem is, i am getting error

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

iam getting same error for all my methods inside UserAuthAPIView class, i have already read solutions on stackoverflow but they are not working i my case.

I have many methods in UserAuthAPIView class and i want to create urls for all of those.

for eg

127.0.0.1:8000/api
127.0.0.1:8000/api/createuser
127.0.0.1:8000/api/login
127.0.0.1:8000/api/<pk>/viewuser

urls.py

from django.conf.urls import url
from UserAPI.api import views
from  UserAPI.api.views import UserAuthAPIView

urlpatterns = [
    url(r'^$', UserAuthAPIView.as_view({'get': 'list'}), name='user-list'),
    url(r'createuser/$', views.UserAuthAPIView.createuser, name='user-create'),
    #url(r'userlogin/$', views.UserAuthAPIView.userlogin, name='user-login'),
]

views.py

class UserAuthAPIView(ModelViewSet):
    queryset = UserModel.objects.all()
    serializer_class = ListViewSerializer

    def get_object(self, queryset=None):
        return self.request.user

    @action(methods=['post'], detail=False, permission_classes=[AllowAny], serializer_class=UserSerializer)
    def createuser(self, request, *args, **kwargs):
        data = request.data
        serializer = UserSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
        return Response({ "status" : "user created successfully"}, status=HTTP_201_CREATED)
joppich
  • 681
  • 9
  • 20
Vikas Gautam
  • 239
  • 1
  • 4
  • 21

2 Answers2

5

Routers preform a couple of operations on the viewset and in particular add a mapping from the http verbs to the associated functions.

You need to do something similar for your action:

urlpatterns = [
    url(r'^$', UserAuthAPIView.as_view({'get': 'list'}), name='user-list'),
    url(r'createuser/$', views.UserAuthAPIView.as_view({'post': 'createuser'}), name='user-create'),
]
Linovia
  • 19,812
  • 4
  • 47
  • 48
3

You are call the Viewset in urls in wrong way. You need do it like this:

router = routers.DefaultRouter()
router.register(r'auth', UserAuthAPIView)

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

Or

urlpatterns = [
    url(r'createuser/$', UserAuthAPIView.as_view({'post':'createuser'}),
]
ruddra
  • 50,746
  • 7
  • 78
  • 101
  • 1
    router is creating urls like 127.0.0.1:8000/api/createuser which is what i want but it will also create url 127.0.0.1:8000/api/createuser// – Vikas Gautam Nov 21 '18 at 12:47
  • what should be url if i want to access any method inside UserAuthAPIView class, because as_view() is giving error AttributeError: 'function' object has no attribute 'as_view' – Vikas Gautam Nov 21 '18 at 12:51
  • Well, it should not. You can use the **updated** answer given by Linovia or last part of my answer :) – ruddra Nov 21 '18 at 12:52
  • and the url by defaultrouter will not create `createuser//`, it will create `createuser /` (space not slash) – ruddra Nov 21 '18 at 12:55
  • i have tried router and problem is url "127.0.0.1:8000/api/auth/ " is not throwing error "page not found" instead i am getting data as a response – Vikas Gautam Nov 21 '18 at 13:26
  • it should be `/api/auth/createuser/` or `/api/auth/createuser /` – ruddra Nov 21 '18 at 13:28