سؤال

I'm trying to setup a class based view in Django Rest Framework.

This is my urls.py -

from django.conf.urls import patterns, include, url
from rest_framework.urlpatterns import format_suffix_patterns
from django.contrib import admin
from TidalDEV import views

admin.autodiscover()

urlpatterns = patterns('',
    url(r'^test/(?P<pk>[0-9]+)/$', views.TESTXMLDetail.as_view()),    
)

And this is my view -

import os, tempfile, zipfile
from django.shortcuts import render
from django.core import serializers
from django.core.serializers import serialize
from django.core.servers.basehttp import FileWrapper
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer, XMLRenderer
from rest_framework.parsers import JSONParser
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated, AllowAny
from itertools import chain
from TAPI.renderers import *
from TAPI.models import *
from TAPI.serializers import JobdtlSerializer, JobmstSerializer, TrgjobSerializer, JobdepSerializer

class TESTXMLDetail(APIView):
    permission_classes = (AllowAny,)
    """
    Retrieve, update or delete a snippet instance.
    """
    def get_object(self, pk):
        try:
            mst = Jobmst.objects.db_manager('AdmiralDEV').raw("""
                query1""", [pk])

            dtl = Jobdtl.objects.db_manager('AdmiralDEV').raw("""
                query2""", [pk])        
            dep = Jobdep.objects.db_manager('AdmiralDEV').raw("""
                query3""", [pk])
            trg = Trgjob.objects.db_manager('AdmiralDEV').raw("""
                query4""", [pk])
        except Jobmst.DoesNotExist:
            return HttpResponse(status=404)

        def get(self, request, pk, format=None):
            jobmststring = JobmstSerializer(mst)
            jobdtlstring = JobdtlSerializer(dtl)
            jobdepstring = JobdepSerializer(dep, many=True)
            trgjobstring = TrgjobSerializer(trg, many=True)

            jobmst_serialized = {'jobmst': jobmststring.data}
            jobdtl_serialized = {'jobdtl': jobdtlstring.data}
            jobdep_serialized = [{'jobdep':item} for item in jobdepstring.data]
            trgjob_serialized = [{'trgjob':item} for item in trgjobstring.data]

            jobgroup = jobmst_serialized, jobdtl_serialized, jobdep_serialized, trgjob_serialized

            jobgroupresponse = TESXMLResponse(jobgroup)
            return jobgroupresponse

When I run the URL all I get is the XML format but then it says -

<detail>Method 'GET' not allowed.</detail>

I've tried setting the permission class in the view as above and I've also put the following lines in my settings.py what gives?

  'DEFAULT_PERMISSION_CLASSES': (
   'rest_framework.permissions.AllowAny',
  ),
هل كانت مفيدة؟

المحلول

You're getting this error because the DRF APIView doesn't have a get method (or a method for any HTTP request type actually).To get your code working you can either rename your get_object method to get (making sure you add the expected parameters request and format), or you can write a get method to return your response:

class TESTXMLDetail(APIView):
    def get(self, request, pk, format=None):
        return self.get_object(pk)

    def get_object(self, pk):
        ...
        ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top