Система комментариев блога с представлением на основе классов в Django
Вот представление на основе функций, которое у меня есть, и оно работает нормально:
def PostDetailView(request, slug):
post = Post.objects.get(slug = slug)
comments = post.comment_set.all()
new_comment = None
if request.method == 'POST':
form = CommentCreateForm(request.POST)
if form.is_valid():
new_comment = form.save(commit = False)
new_comment.post = post
new_comment.save()
else:
form = CommentCreateForm()
context = {'post': post, 'comments': comments, 'form': form, 'new_comment': new_comment}
return render(request, 'blog/post-detail.html', context)
Я пытаюсь преобразовать это в представление, основанное на классах, в соответствии со следующим:
class PostDetailView(FormMixin, DetailView):
model = Post
template_name = 'blog/post-detail.html'
form_class = CommentCreateForm
new_comment = None
def get_success_url(self):
return reverse('post_detail', kwargs={'slug': self.object.slug})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = self.object.comment_set.all()
context['form'] = self.get_form()
context['new_comment'] = self.new_comment
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.instance.post = self.object
form.save()
self.new_comment = True
return redirect(self.object.get_absolute_url())
Шаблон выглядит следующим образом:
<h1>{{post.title}}</h1>
{{post.body|linebreaks}}
{% with comments.count as total_comments %}
<h2>{{ total_comments}} comment{{total_comments|pluralize}}</h2>
{% endwith %}
{% for comment in comments %}
<div class="comment">
<p class="info">
Comment {{forloop.counter}} by {{comment.name}} {{comment.created}}
</p>
{{comment.body|linebreaks}}
</div>
{% empty %}
<p>There are no comments yet.</p>
{% endfor %}
{% if new_comment %}
<h2>Your comment has been added.</h2>
{% else %}
<h2>Add a new comment</h2>
<form method = "post">
{{form.as_p}}
{% csrf_token %}
<p>
<input type="submit" value="Add comment">
</p>
</form>
{% endif %}
В частности, после того, как пользователь отправил комментарий, я хочу скрыть форму комментария. Это прекрасно работает (через переменную 'new_comment'. Я пытался воссоздать то же самое в представлении на основе класса, но, похоже, это не работает.
Как сделать так, чтобы представление передавало обновленное значение 'new_comment' в качестве контекста шаблону в представлении на основе класса?