@guit24

Как правильно реализовывать post запросы для DetailView?

Как правильно реализовывать post запросы для DetailView? то, что делаю я, вызывает лишь ошибку 405
class NewsDetailView(DetailView):
model = NewsModel

def get_context_data(self, **kwargs):
context = super().get_context_data()
comment_form = CommentForm()
context['comment_form'] = comment_form
return context

def post(self, request, pk):
comment_form = CommentForm(request.POST)

if comment_form.is_valid():
comment_form['news_item'] = pk
comment_form.save()
# CommentModel.objects.create(**comment_form.cleaned_data)
return HttpResponseRedirect('/news')

return render(request, 'app_news/newsmodel_detail.html', context={'comment_form': comment_form})
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Правильно - не переопределять метод post в наследнике DetailView и не заниматься валидацией формы вручную.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AlexSabanov
Вот так надо сделать:
1. Добавляешь миксин
2. Указываешь форму в form_class
2.1. Теперь по переменной form в html можешь формировать саму форму
3. Переопределяешь метод post и добавляешь значения в форму из kwargs или queryset

class NewsDetailView(ModelFormMixin, DetailView):
    model = NewsModel
    slug_url_kwarg = 'new_slug'  # Обязательно для DetailView ссылается на переменную в url
    form_class = CommentForm
    

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

    def post(self, request, *args, **kwargs):
        comment_form = CommentForm(data=request.POST)

        if comment_form.is_valid():
            comment_form = comment_form.save(commit=False)
            # здесь добавляешь к полям формы новые значения,
            # которые можешь взять из коллекции kwargs,
            # обращаясь по ключу
            comment_form.save()
            return redirect('news', *args, **kwargs)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы