Метод 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