André Luiz
André Luiz

Reputation: 7282

Django Rest Framework - why serializer.data is empty

I'm working in a form that must use a django rest framework serializer class as the form. Let me show you a bit of code so you can understand better.

In my model I have a property that returns the serializer class dynamically:

@property
def content_serializer_class(self):
    backend_module = self.backend_module

    if backend_module == "youtube":
        return YoutubeSerializer
    elif backend_module == "googleplay":
        return GoogleplaySerializer
    elif backend_module == "bellone":
        return BelloneSerializer
    elif backend_module == "rogersvod":
        return RogersvodSerializer

Then I have the view:

class ContentCreateView(LoginRequiredMixin, PermissionRequiredMixin, APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'delivery/content_form.html'
    permission_required = 'delivery.change_delivery'

    def get(self, request, delivery_id):
        delivery = get_object_or_404(Delivery, pk=delivery_id,owner=self.request.user)
        if not delivery.can_change:
            raise Http404

        return Response({'serializer': delivery.content_serializer_class, 'delivery': delivery})

    def post(self, request, delivery_id):
        delivery = get_object_or_404(Delivery, pk=delivery_id,owner=self.request.user)
        if not delivery.can_change:
            raise Http404

        serializer = delivery.content_serializer_class(data=request.data)

        if not serializer.is_valid():
            return Response({'serializer': delivery.content_serializer_class, 'delivery': delivery})

        print 'serializer', serializer.data

        nextUrl = self.request.POST.get("next", "")
        if nextUrl:
            return redirect(nextUrl)
        else:
            return redirect(reverse('delivery:delivery-detail', args=[delivery_id]))

And my template:

<form role="form" id="form-content" class="form-horizontal" method="post">
    {% csrf_token %}
    <input type="hidden" id="id-next" name="next" value="" />
    {% render_form serializer template_pack='rest_framework/horizontal' %}            
</form>  

I'm following this guide.

The problem is that when I try to get the json from the serializer (serializer.data) is it empty. The validation works properly, the form render properly but the json data is empty.

What am I missing? Thanks for any help.

Upvotes: 4

Views: 3651

Answers (1)

dmitryro
dmitryro

Reputation: 3506

As the format is normally

  mymodel = MyModel.objects.get(id=model_id) 
  serializer = MyModelSerializer(mymodel,many=False) # for single object

so on class level it has to be:

def content_serializer_class(self):
    backend_module = self.backend_module

    if backend_module == "youtube":
         return YoutubeSerializer(self,many=False)

    elif backend_module == "googleplay":
        return GoogleplaySerializer(self,many=False)

    elif backend_module == "bellone":
        return BelloneSerializer(self,many=False)

elif backend_module == "rogersvod":
    return RogersvodSerializer(self,many=False)

Upvotes: 2

Related Questions