Как реализовать функцию follow/unfollow без перезагрузки страницы в Django
Я создаю веб-приложение с использованием Django, в котором пользователи могут следовать или не следовать за элементами (например, фотографиями) из списка. В настоящее время я реализовал функцию следования/отмены, но она перезагружает страницу каждый раз, когда пользователь нажимает на кнопку следования или отмены. Я хочу добиться этого без перезагрузки страницы, чтобы пользователь оставался на той же странице, а изменения состояния (следовать/не следовать) отражались немедленно.
models.py
class UserProfile(models.Model):
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
follows = models.ManyToManyField(Photo, related_name='followers')
def __str__(self):
return self.user.username
views.py
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from .models import Photo, Episode, UserProfile
def viewPhoto(request, pk):
photo = get_object_or_404(Photo, id=pk)
episodes = Episode.objects.filter(photo=photo)
if request.user.is_authenticated:
user_profile, created = UserProfile.objects.get_or_create(user=request.user)
is_following = photo in user_profile.follows.all()
else:
is_following = False
context = {
'photo': photo,
'episodes': episodes,
'is_following': is_following,
}
return render(request, 'photos/photo.html', context)
@login_required
def follow(request, pk):
photo = get_object_or_404(Photo, id=pk)
user_profile, created = UserProfile.objects.get_or_create(user=request.user)
user_profile.follows.add(photo)
return redirect('photo', pk=pk)
@login_required
def unfollow(request, pk):
photo = get_object_or_404(Photo, id=pk)
user_profile, created = UserProfile.objects.get_or_create(user=request.user)
user_profile.follows.remove(photo)
return redirect('photo', pk=pk)
html
{% if is_following %}
<div class="btn follow">
<a href="{% url 'unfollowPhoto' photo.id %}">Unfollow</a>
</div>
{% else %}
<div class="btn follow">
<a href="{% url 'followPhoto' photo.id %}">Follow</a>
</div>
{% endif %}
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('photo/<int:pk>/', views.viewPhoto, name='photo'),
path('photo/<int:pk>/follow/', views.follow, name='followPhoto'),
path('photo/<int:pk>/unfollow/', views.unfollow, name='unfollowPhoto'),
]