Email request with DJango DetailView gives an error. MyView object has no attribute 'object'

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

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 get the error that

'Detail' object has no attribute 'object'

I tried to assign an object in a context context and myself. But nothing works.

+4
source share
4 answers

What you are missing is that before calling get_context_data()you need to assign an object to a class or to yourself.

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 = 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 convey the context. There are no other arguments.

Hope this works for you.

+10
source

You inherit the wrong general view. You need to inherit from CreateView, for example:

class CreateModel(CreateView):
  model = MyModel
  template_name = 'mymodel_detail.html'
  form_class = DetailForm
  success_url = reverse('/thanks')

  def form_valid(self, form):
     # this method is called when the form
     # is successfully validated
     # if you need to do something with
     # the database object, this is the place
     # do not use it to redirect to a success page
     # use the success_url for that
     return super(CreateModel, self).form_valid(form)
+2

Safrazs, . , , , - .

class QuestionDetailView(generic.DetailView):
    model = Question
    template_name = 'forum/question.html'

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

        return context

    def post(self, request, *args, **kwargs):
        form = ReplyForm(request.POST)

        if form.is_valid():
            reply = form.save(commit=False)
            reply.creator = request.user
            reply.question = self.get_object()
            reply.save()
            self.object = self.get_object()
            context = context = super().get_context_data(**kwargs)
            context['form'] = ReplyForm

            return self.render_to_response(context=context)

        else:
            self.object = self.get_object()
            context = super().get_context_data(**kwargs)
            context['form'] = form

            return self.render_to_response(context=context)
+1

super : Detail, MessageDetail. , . (CreateView, DeleteView, FormView, UpdateView). DetailView . http://ccbv.co.uk/

0

Source: https://habr.com/ru/post/1606736/


All Articles