Comment Mixin для Django. Почему CommentPost определен именно так?
Я начинающий Django, и я читал книгу WS Vincent "Django для начинающих". В предпоследней главе он пишет следующий код. Он создает представление для комментариев, которое может обрабатывать GET и POST запросы, не смешивая FormMixin и созданный им ArticleDetailView. Я все это понимаю, но я не понимаю, почему это было построено именно так? Может ли кто-нибудь объяснить, что такое self.object и self.get_object в этом примере? Также, почему мы сохраняем дважды во втором методе? Спасибо!:
def post(self, request, *args, **kwargs):
self.object = self.get_object()
return super().post(request, *args, **kwargs)
def form_valid(self, form):
comment = form.save(commit=False)
comment.article = self.object
comment.save()
return super().form_valid(form)
def get_success_url(self):
article = self.get_object()
return reverse("article_detail", kwargs={"pk": article.pk})
У меня нет книги, но get_object
вернет объект, который отображает данное представление. В вашем примере представление, вероятно, настроено на отображение одного Article
, но форма публикует данные для Comment
. Вы используете метод get_object
для получения доступа к экземпляру Article
, чтобы можно было связать с ним Comment
.
Второй вопрос: Он не сохраняет дважды. Это может быть непонятно, но когда вы устанавливаете commit
на False
, он инстанцирует объект, но не сохраняет его. Вы делаете это, когда хотите добавить дополнительную информацию после инстанцирования экземпляра модели. На самом деле она сохраняется в базе данных после вызова comment.save()
.