intelis
intelis

Reputation: 8058

Empty routes in Django Rest Framework

I'm trying to register a simple method into a DRF and I'm having some problems. The route is not showing in API Explorer.

It's probably something simple that I'm missing..
How can I get the register route to show in the API?

Resuts (empty)

GET /api/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{}

Urls

from django.conf.urls import url, include
from django.contrib import admin
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token

from reservations.views.homepage import HomepageView
from users.views import UserViewSet

""" API routes
"""
router = routers.DefaultRouter()
router.register(r'test', UserViewSet, base_name='users')

""" Route patterns
"""
urlpatterns = [
    url(r'^$', HomepageView.as_view(), name='homepage'),
    url(r'^api/', include(router.urls)),
    url(r'^api-token-auth/', obtain_jwt_token),
    url(r'^admin/', admin.site.urls),
]

Viewset

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from rest_framework import viewsets
from rest_framework.response import Response


class UserViewSet(viewsets.ViewSet):

    def register(self, request):
        return Response({
            'status': 'User registered'
        })

Upvotes: 1

Views: 1481

Answers (3)

Hugo Brilhante
Hugo Brilhante

Reputation: 606

Use @list_route for this. marking extra actions for routing

...

@list_route(methods=['post'])
def register(self, request):
    return Response({
        'status': 'User registered'
    })

Upvotes: 1

Muhammad Hassan
Muhammad Hassan

Reputation: 14391

ViewSet has some specific methods for every method (GET, POST, PUT etc) like list, detail, create, update etc. You should use that methods. Api explorer decides on the basis of these methods that which method is allowed by your view. You can see these methods here.

In your case, I suppose you want to create new user. So you should use create method like this.

class UserViewSet(viewsets.ViewSet):

    def create(self, request, *args, **kwargs):
        return Response({
            'status': 'User registered'
        })

Upvotes: 2

Anup Yadav
Anup Yadav

Reputation: 3005

If you want to work only with then list, create method you must have in it. Please check below example of my code. please check this link for more information http://www.django-rest-framework.org/api-guide/viewsets/

class UserViewSet(viewsets.ViewSet):

    def list(self, request):
        queryset = crm_models.EmployeeLeaveApp.objects.all()
        serializer = serializers.EmployeeVisitSerializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, pk=None):
        queryset = crm_models.EmployeeLeaveApp.objects.all()
        user = get_object_or_404(queryset, pk=pk)
        serializer = serializers.EmployeeVisitSerializer(user)
        return Response(serializer.data)


    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

Upvotes: 1

Related Questions