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!
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 %}