0

There is a view in the Django project (a paginated blog) that is responsible for how likes work. It has one drawback: when a user likes a post, it is redirected to the main page of the site. How can I fix this so that the user would remain on the page where they liked.

views.py

class AddLikeView(View):
     def post(self, request, *args, **kwargs):
         blog_post_id = int(request.POST.get('blog_post_id'))
         user_id = int(request.POST.get('user_id'))
         url_from = request.POST.get('url_from')

         user_inst = User.objects.get(id=user_id)
         blog_post_inst = News.objects.get(id=blog_post_id)

         try:
             blog_like_inst = BlogLikes.objects.get(blog_post=blog_post_inst, liked_by=user_inst)
         except Exception as e:
              blog_like = BlogLikes(blog_post=blog_post_inst,
                          liked_by=user_inst,
                          like=True)
              blog_like.save()
         return redirect(url_from)

template.py

<form action="{% if not is_liked_bool %}{% url 'add' %}{% else %}{% url 'remove' %}{% endif %}" method="post">
{% csrf_token %}
<input type="hidden" name="blog_post_id" value="{{ blog_post_id }}">
<input type="hidden" name="user_id" value="{% if user.is_authenticated %}{{ request.user.id }}{% else %}None{% endif %}">
<input type="hidden" name="url_from" value="{{ request.path }}">

{% if is_liked_bool %}
    <input type="hidden" name="blog_likes_id" value="{{ blog_likes_id }}">
{% endif %}



<button type="submit" class="btn btn-success">
    {% if not is_liked_bool %}
        <i class="fi-xnluxl-heart">♥</i>
    {% else %}
        <i class="fi-xnluxl-heart-solid">♥</i>
    {% endif %}
    <span class="likes-qty">{{ likes_counter }}</span>
</button>
Paul
  • 53
  • 3
  • 21
  • You need to prevent default form action and call an ajax request from front end when submit button will be clicked. This will make sure your page doesn't reload on form submit. You can go through this https://stackoverflow.com/questions/7335780/how-to-post-a-django-form-with-ajax-jquery – Amandeep Singh Nov 26 '21 at 14:57

1 Answers1

1

I think you should check the url_from field first. Just print it and if it's wrong, you should change the {{request.path}} field in your template.

You can try this:

{{ request.get_full_path }}

And also if I remember correctly, you can access the path with request.path in your view and no need to send path via template.

Onur Taç
  • 136
  • 1
  • 5