Search code examples
djangodjango-formsdjango-views

Post request with Django DetailView gives error 'MyView' object has no attribute 'object'


I am trying to create an object with django DetailView. My code is like that.

class Detail(DetailView):
    model = MyModel
    template_name = 'mymodel_detail.html'

    def get_context_data(self, **kwargs):
        context = super(Detail, self).get_context_data(**kwargs)
        context['form'] = DetailForm
        return context

    def post(self, request, *args, **kwargs):
        form = DetailForm(request.POST, request.FILES)
        if form.is_valid():
            context['reply_form'] = DetailForm
            self.object = super(Detail, self).get_object()
            context['object'] = super(Detail, self).get_object()

            return self.render_to_response(request=request, template=self.get_template_names(), context=context)
        else:
            context = context = super(Detail, self).get_context_data(**kwargs)
            context['reply_form'] = form
            self.object = super(Detail, self).get_object()
            context['object'] = super(Detail, self).get_object()

            return self.render_to_response(request=request, template=self.get_template_names(), context=context)

But here I am getting error that

'Detail' object has no attribute 'object'

I tried to assign object in context instance and with self as well. But nothing works.


Solution

  • What you are missing here is that you have to assign the object to the class or self before calling the get_context_data().

    class Detail(DetailView):
        model = MyModel
        template_name = 'mymodel_detail.html'
    
        def get_context_data(self, **kwargs):
            context = super(Detail, self).get_context_data(**kwargs)
            context['form'] = DetailForm
            return context
    
        def post(self, request, *args, **kwargs):
            form = DetailForm(request.POST, request.FILES)
            if form.is_valid():
                # Write Your Logic here
    
                self.object = self.get_object()
                context = super(Detail, self).get_context_data(**kwargs)
                context['form'] = DetailForm
                return self.render_to_response(context=context)
    
            else:
                self.object = self.get_object()
                context = super(Detail, self).get_context_data(**kwargs)
                context['form'] = form
                return self.render_to_response( context=context)
    

    and in render_to_response() Just pass context. No other arguments.

    Hope it will work for you.