Django (CBV), как отобразить форму для комментариев под постом? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть кнопка «Добавить комментарий» под сообщением, которая перенаправляет на URL с формой для комментария, и работает нормально, но ... Я хотел бы, чтобы эта форма отображалась под сообщением.

Я попытался включить URL с формой комментария в шаблон post_detail.html, но получил ошибки о том, что форма недействительна. Когда я передавал форму в PostDetail() контекст, она отображалась, но теперь работает.

Как мне объединить PostDetail() с моим CommentForm() для отображения по тому же URL?

Вот части моего кода:

models.py

class Comment(models.Model):
    author = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    text = models.TextField()
    text_html = models.TextField(editable=False)
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    approved_comment = models.BooleanField(default=False)

    def __str__(self):
        return self.text

    def save(self, *args, **kwargs):
        self.text_html = misaka.html(self.text)
        super().save(*args, **kwargs)

forms.py

class CommentForm(forms.ModelForm):

    class Meta:
        model = models.Comment
        fields = ('text',)

views.py

class PostDetail(SelectRelatedMixin, generic.DetailView):
    model = models.Post
    select_related = ('user', 'group')

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user__username__iexact=self.kwargs.get('username'))

...

@login_required
def add_comment_to_post(request, pk, **kwargs):
    post = get_object_or_404(models.Post, pk=pk)
    if request.method == 'POST':
        form = forms.CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user
            comment.save()
            return redirect('posts:single', username=post.user, pk=post.pk)
    else:
        form = forms.CommentForm()
    return render(request, 'posts/comment_form.html',{'form': form})

post_detail.html

{% extends "posts/post_base.html" %}

{% block post_content %}
  <div class="col-md">
    {% include "posts/_post.html" %}
  </div>
{% endblock %}

{% block post_post %}
{% if user.is_authenticated %}
  <div class="container comments">

    <!-- COMMENTS FORM IN HERE -->

    <a class="btn btn-primary add-comment" id="add-comment" href="{% url 'posts:add_comment' username=post.user.username pk=post.pk %}">Add Comment</a>
    {% for comment in post.comments.all %}
    <div class="jumbotron comment">
        <p>{{ comment.author }} <span>{{ comment.created_at }}</span></p>
      <p>{{ comment.text_html|safe }}</p>
    </div>
    {% endfor %}
  </div>
{% endif %}
{% endblock %}

Я буду очень благодарен за то, что хотя бы объяснил, какие шаги мне нужно предпринять для достижения описанного результата.

...