Django: проверить, понравился ли пользователю пост и соответствующие комментарии в шаблоне - PullRequest
0 голосов
/ 01 февраля 2020

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

Модель сообщения:

class Post(models.Model):
    author = models.ForeignKey(CustomUser,on_delete=models.CASCADE,)
    title = models.CharField(max_length=200,null=True)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    slug = models.SlugField(unique=True, blank=True)
    nLikes = models.IntegerField(default= 0)

Модель комментария:

class Comment(models.Model):
post = models.ForeignKey('Post', related_name='comments',on_delete=models.CASCADE,)
author = models.ForeignKey(CustomUser,on_delete=models.CASCADE,)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
slug = models.SlugField(unique=True, default=uuid.uuid4)
nLikes = models.IntegerField(default= 0)

Опубликовать как модель :

class PostLike(models.Model):
post = models.ForeignKey('Post', related_name='related_post',on_delete=models.CASCADE,)
user = models.ForeignKey(CustomUser,on_delete=models.CASCADE,)
liked_date = models.DateTimeField(default=timezone.now)

комментарий как модель:

class CommentLike(models.Model):
    comment = models.ForeignKey('Comment', related_name='related_comment',on_delete=models.CASCADE,)
    user = models.ForeignKey(CustomUser,on_delete=models.CASCADE,)
    liked_date = models.DateTimeField(default=timezone.now)

мой шаблон будет похож на это. Я добавляю упрощенную версию здесь, чтобы упростить задачу

{% for post in post_queryset %}
   <div>
     {{ post.text }}
   </div>
   {% for comment in post.comments.all %}
   </div>
     {{ comment.text }}
   </div>
   {% endfor %}
{% endfor %}

Каков наилучший способ проверить, нравится ли пользователю публикация и комментарий? Я думаю об использовании тегов шаблонов, есть ли лучший способ?

1 Ответ

0 голосов
/ 01 февраля 2020

Сначала вы должны исправить свои модели.

Эта часть очень важна, ваша будущая головная боль полностью зависит от ваших моделей. Поэтому вы должны быть особенно осторожны

class Post(models.Model):
    class Meta:
        db_table = "post"

    post_author = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name="post_author_key"
    )
    post_title = models.CharField(
        max_length=200,
        null=False,
        blank=False
    )
    post_text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)
    slug = models.SlugField(unique=True, blank=True)
    # nLikes = models.IntegerField(default= 0)
    # Don't store likes count  in model, this is not good for OOP


class PostLike(models.Model):
    class Meta:
            db_table = "post_like"
    post_like_post = models.ForeignKey('Post',
        related_name='post_like_post_key',
        on_delete=models.CASCADE,
        )
    post_like_user = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE
        related_name="post_like_user_key"
    )
    post_like_date = models.DateTimeField(default=timezone.now)


class Comment(models.Model):
    class Meta:
        db_table = "comment"
    comment_post = models.ForeignKey('Post',
        related_name='comment_post_key',
        on_delete=models.CASCADE
    )
    comment_author = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name="comment_author_key"
    )
    comment_text = models.TextField()
    comment_created_date = models.DateTimeField(
        default=timezone.now
    )
    comment_slug = models.SlugField(
        unique=True,
        default=uuid.uuid4
    )
    # nLikes = models.IntegerField(default= 0)
    # Same as likes for post, don't store collectable data in mdoel


class CommentLike(models.Model):
    class Meta:
        db_table = "comment_like"
    comment_like_comment = models.ForeignKey(
        Comment,
        related_name='comment_like_comment_key',
        on_delete=models.CASCADE
    )
    comment_like_user = models.ForeignKey(
        CustomUser,
        on_delete=models.CASCADE,
        related_name="comment_like_user_key"
    )
    comment_like_date = models.DateTimeField(default=timezone.now)

Не забудьте совершить миграцию. после этого давайте предположим, что, по вашему мнению, вы подготовили отдельный пост, а теперь вы используете его в своем шаблоне. Таким образом, вы хотите добавить значок ThumbsUp к этому сообщению, в случае , если пользователю понравился этот пост и оставленный комментарий

your_template. html

{{ custom_user }}
{{ post }}

{% for liked in post.post_like_post_key.all %}
    {% if liked.post_like_user_id == custom_user.id %}
        {% for comment in post.comment_post_key.all %}
            {% if comment.comment_author_id == custom_user.id %}
                <fa class="fa fa-thumbs-up"></fa>
            {% else %}
                <fa class="fa fa-thumbs-up disabled"></fa>
            {% endif %}
    {% else %}
        <fa class="fa fa-thumbs-up disabled"></fa>
    {% endif %}
...