Kachkol Asa
Kachkol Asa

Reputation: 432

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)

Template

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

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!

Upvotes: -1

Views: 74

Answers (1)

Niko
Niko

Reputation: 3798

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:

models.py

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()

views.py

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.

posts.html

{% extends 'base.html' %}

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

Upvotes: 1

Related Questions