Как добавить вложенные комментарии в блоге Django - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть приложение для блога, где у меня есть раздел комментариев. Комментировать может только авторизованный пользователь. Я хочу добавить возможность добавлять ответы на комментарии во вложенном формате, но я понятия не имею, как.

Вот модели, которые включены в часть комментариев:

class Article(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    publish_date = models.DateField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    tag = models.ManyToManyField(Tag)
    thumbnail = models.ImageField(blank=True)
    content = HTMLField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-page', kwargs={'id': self.id})

    @property
    def get_comments(self):
        return self.comment_content.all()



class Comment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    article = models.ForeignKey(Article, related_name='comment_content', on_delete=models.CASCADE)
    content = models.TextField()

    def __str__(self):
        return self.user.username

Форма модели, которую я создал:

class CommentForm(forms.ModelForm):
    content = forms.CharField(
        widget = forms.Textarea(
            attrs= {
                'class': 'form-control',
                'id': 'message',
                'cols': '30',
                'rows': '10',
            }
        )
    )

Способ представления каждого комментария:

{% for comment in article.get_comments %}
                <li class="comment">
                  <div class="comment-body">
                    <h3>{{ comment.user.username }}</h3>
                    <div class="meta mb-3">{{ comment.timestamp }}</div>
                    <p>{{ comment.content }}</p>
                    <p><a href="#" class="reply">Reply</a></p>
                  </div>
                </li>
{% endfor %}

Я использовал @property для отображения комментариев. Нужно ли менять общий способ представления комментариев? Может ли кто-нибудь помочь мне с созданием ответов? (Кстати, кнопка ответа ничего не делает. Она пришла с шаблоном, над которым я работаю)

1 Ответ

1 голос
/ 13 февраля 2020

Поскольку вы хотели бы иметь возможность добавлять несколько комментариев к комментарию, вам необходимо создать другую модель с именем «Ответы», имеющую отношение «многие к одному» с моделью комментариев. Таким образом, каждая статья может иметь несколько комментариев, и каждый комментарий может иметь несколько ответов. Ваша модель ответов будет выглядеть примерно так:

class Reply(models.Model):
    comment = models.ForeignKey(Comment, related_name='replies',  on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)
    reply = models.TextField()

    def __str__(self):
        return self.user.username

    @property
    def get_replies(self):
        return self.replies.all()

Все ответы, связанные с комментарием, можно отображать так же, как и для комментариев.

{% for comment in article.get_comments %}
    <li class="comment">
    <div class="comment-body">
        <h3>{{ comment.user.username }}</h3>
        <div class="meta mb-3">{{ comment.timestamp }}</div>
        <p>{{ comment.content }}</p>

            {% for reply in comment.get_replies %}
                <li class="reply">
                <div class="reply-body">
                    <h3>{{ reply.user.username }}</h3>
                    <div class="meta mb-3">{{ reply.timestamp }}</div>
                    <p>{{ reply.reply }}</p>
                    #ToDo Create a view to add replies and hook the url to href below
                    <p><a href="#" class="reply">Reply</a></p>
                </div>
                </li>
            {% endfor %}
    </div>
    </li>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...