Check either someone has liked a post or not within the template django

I have this model struture:

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.CharField(max_length=1200, blank=True)

class PostLike(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)


for post in posts
# want to check here, something like:
if post.userliked write something endif

Now what I want is to check either the current loggedin user has liked the post or not within the django template.

I have tried, post.postlike_set but of course that won't work because it's for all the likes, is there anyway that I can check if the current loggedin user has liked the post or not.

Please help!

You can have likes in a many-to-many relationship while accessing this field and user (as the owner of the post) field with FK related name:

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    text = models.TextField()
    likes = models.ManyToManyField(User, related_name='likes')

This way we can access Post created by an User with user.posts.all() and all posts liked by an User with user.likes.all()

def posts(request):
    posts = Post.objects.all()
    return render(request, 'posts.html', {'posts': posts})

Since you want to check the logged in user, we do not need to pass it by context, instead we access it directly in template using the request object.


{% extends 'base.html' %}

{% block content %}
    {% for post in posts %}
        {% if post in request.user.likes.all %}
            <p> You already liked this post </p>
        {% else %}
        {% endif %}
    {% endfor %}
{% endblock content %}
Back to Top