Метод POST не работает в django, где я использую Formview

У меня есть класс, в котором используется и FormView и DetailView. когда я отправляю post запрос, я вижу этот лог в терминале [06/Apr/2022 14:44:16] "POST /profile/question/1/ HTTP/1.1" 200 6327, но не работает post, методы form_valid и form_invalid. не вызывает эти 3 функции и поэтому форма не сохраняется

вот мой код ->

class QuestionDetail(FormView, DetailView):
    model = Question
    form_class = CommentForm
    template_name = "Profile/question_detail.html"
    context_object_name = "detail"

    def dispatch(self, request, *args, **kwargs):
        try:
            self.object = self.get_object()
        except:
            return redirect('Profile:error')

        self.get_object()
        return super(QuestionDetail, self).get(request, *args, **kwargs)

    def get_success_url(self):
        return self.request.path

    def get_context_data(self, *args, **kwargs):
        like_exist=bool(Like.objects.filter(user=self.request.user, question=self.get_object()))
        dislike_exist=bool(DisLike.objects.filter(user=self.request.user, question=self.get_object()))
        self.object=self.get_object()
        context = super(QuestionDetail, self).get_context_data(**kwargs)
        try:
            question = Question.objects.get(id=self.kwargs["pk"])
            context['detail'] = question
            context['like_ex'] = like_exist
            context['dislike_ex'] = dislike_exist
        except Http404:
            return reverse("Profile:error")
        return context

    def post(self, request, *args, **kwargs):
        print("Not working post method")

    def form_invalid(self, form):
        print("Error")
        return super(QuestionDetail, self).form_invalid(form)

    def form_valid(self, form):
        print("It's here")
        form.instance.user = self.request.user
        form.instance.question = self.get_object()
        form.save()
        return super(QuestionDetail, self).form_valid(form)

я не понимаю, что произошло.

Вам нужно вызвать метод post в вашем методе dispatch:

class QuestionDetail(FormView, DetailView):
    model = Question
    form_class = CommentForm
    template_name = "Profile/question_detail.html"
    context_object_name = "detail"

    def dispatch(self, request, *args, **kwargs):
        try:
            self.object = self.get_object()
        except:
            return redirect('Profile:error')

        self.get_object()
        return self.post(request, *args, **kwargs)

    def get_success_url(self):
        return self.request.path

    def get_context_data(self, *args, **kwargs):
        like_exist=bool(Like.objects.filter(user=self.request.user, question=self.get_object()))
        dislike_exist=bool(DisLike.objects.filter(user=self.request.user, question=self.get_object()))
        self.object=self.get_object()
        context = super(QuestionDetail, self).get_context_data(**kwargs)
        try:
            question = Question.objects.get(id=self.kwargs["pk"])
            context['detail'] = question
            context['like_ex'] = like_exist
            context['dislike_ex'] = dislike_exist
        except Http404:
            return reverse("Profile:error")
        return context

    def post(self, request, *args, **kwargs):
        print("Not working post method")

    def form_invalid(self, form):
        print("Error")
        return super(QuestionDetail, self).form_invalid(form)

    def form_valid(self, form):
        print("It's here")
        form.instance.user = self.request.user
        form.instance.question = self.get_object()
        form.save()
        return super(QuestionDetail, self).form_valid(form)

Теперь вызовите form_invalid и form_valid в вашей реализации post.

Скорее длинный комментарий, чем четкий ответ

Возможно, лучше использовать SingleObjectMixin в сочетании с FormView. Наследование от двух полных классов CBV, вероятно, не поддерживается и может вызвать головную боль, например, после обновления версии Django. В то время как классы *Mixin предназначены для хорошего соединения.

Главное, что вы должны знать об этом, это то, что self.object не устанавливается включением миксина. Вы должны явно установить его, например, путем подклассификации метода setup:

def setup( self, request, *args, **kwargs):
    super().setup( request, *args, **kwargs)
    self.object = self.get_object()  # link SingleObjectMixin

Классические CBVs в бесценном ресурсе для навигации по Class-Based Views

Вернуться на верх