Like button not recording the data
Question:
I have implemented a like button onto my view_post page, but the like’s aren’t been registered. When the button is clicked the page is redirected correctly but no likes are added.
views
def get_post(request, slug):
try:
post = BlogPost.objects.get(slug=slug)
except BlogPost.DoesNotExist:
messages.error(request, 'This post does not exist.')
post = None
comment_form = CommentForm()
return render(request, 'mhpapp/view-post.html', {'post': post, 'comment_form': comment_form,})
def like_post(request, slug):
template_name = 'view-post.html'
post = get_object_or_404(BlogPost, slug=slug)
liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
else:
post.likes.add(request.user)
messages.success(request, ("Thanks for the like...:-)"))
liked = True
return redirect('get_post', {'slug': slug,})
urls
path('<slug:slug>/', views.get_post, name='viewpost'),
path('<slug:slug>/',views.like_post, name='likepost'),
html
<strong>{{ post.total_likes }} Likes</strong>
{% if user.is_authenticated %}
<form action="{% url 'likepost' post.slug %}" method="POST">
{% csrf_token %}
{% if request.user in post.likes.all %}
<button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="sumbit" name="post-id" value="{{ post.slug }}"><i class="fa-solid fa-heart-crack"></i></button>
{% else %}
<button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="sumbit" name="post-id" value="{{ post.slug }}"><i class="fa-solid fa-heart"></i></button>
{% endif %}
</form>
{% else %}
{% endif %}
Answers:
You cannot set same path url for two views. django will loop into all url and take first which match the url path.
So in your case, your reversed url likepost always call get_post
view I think.
Test like that:
path('view/<slug:slug>/', views.get_post, name='viewpost'),
path('like/<slug:slug>/',views.like_post, name='likepost'),
I have implemented a like button onto my view_post page, but the like’s aren’t been registered. When the button is clicked the page is redirected correctly but no likes are added.
views
def get_post(request, slug):
try:
post = BlogPost.objects.get(slug=slug)
except BlogPost.DoesNotExist:
messages.error(request, 'This post does not exist.')
post = None
comment_form = CommentForm()
return render(request, 'mhpapp/view-post.html', {'post': post, 'comment_form': comment_form,})
def like_post(request, slug):
template_name = 'view-post.html'
post = get_object_or_404(BlogPost, slug=slug)
liked = False
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
liked = False
else:
post.likes.add(request.user)
messages.success(request, ("Thanks for the like...:-)"))
liked = True
return redirect('get_post', {'slug': slug,})
urls
path('<slug:slug>/', views.get_post, name='viewpost'),
path('<slug:slug>/',views.like_post, name='likepost'),
html
<strong>{{ post.total_likes }} Likes</strong>
{% if user.is_authenticated %}
<form action="{% url 'likepost' post.slug %}" method="POST">
{% csrf_token %}
{% if request.user in post.likes.all %}
<button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="sumbit" name="post-id" value="{{ post.slug }}"><i class="fa-solid fa-heart-crack"></i></button>
{% else %}
<button class="btn btn-outline-secondary rounded-0 custom-button" id="like" type="sumbit" name="post-id" value="{{ post.slug }}"><i class="fa-solid fa-heart"></i></button>
{% endif %}
</form>
{% else %}
{% endif %}
You cannot set same path url for two views. django will loop into all url and take first which match the url path.
So in your case, your reversed url likepost always call get_post
view I think.
Test like that:
path('view/<slug:slug>/', views.get_post, name='viewpost'),
path('like/<slug:slug>/',views.like_post, name='likepost'),