Django ajax Как мне изменить свой код, чтобы использовать ajax для лайков сообщений без обновления

#javascript #python #jquery #django #ajax

#javascript #python #jquery #django #ajax

Вопрос:

Я пытаюсь создать кнопку «Мне нравится». В настоящее время у меня есть это, чтобы пользователю могло понравиться / не понравиться сообщение в статье. Однако всякий раз, когда они нажимают кнопку, страница сбрасывается и возвращает их к началу. Я хочу использовать Ajax, чтобы исправить это. Это мои файлы для проекта.

index.py

 <form action="{% url 'like-article-view' %}" method="POST" class="mb-1">
{% csrf_token %}
<input type="hidden" name="article_id" value={{article.id}}>
<button type="submit" class="ui primary button" name="{{article.id}}" id="like-unlike-btn">

{% if user not in article.liked.all%}
Like
{% else %}
Unlike
{% endif %}
</button>
 

view.py

 def like_unlike_post(request):
    user = request.user.id

    if request.method == 'POST':
        article_id = request.POST.get('article_id')
        article_obj = Article.objects.get(id=article_id)
        user_ = CustomUser.objects.get(id = user)

        if user_ in article_obj.liked.all():
            article_obj.liked.remove(user_)
        else:
            article_obj.liked.add(user_)

        like, created = Like.objects.get_or_create(user=user_, article_id=article_id )
        if not created:
            if like.value=='Like':
                like.value='Unlike'
            else:
                like.value='Like'
        else:
             like.value='Like'       
        article_obj.save()
        like.save()

    return redirect('index')
 

urls.py (соответствующие URL-адреса)

 path('', views.indexView, name="index")
path('liked/', views.like_unlike_post, name='like-article-view'),
 

models.py (соответствующие модели)

 class Article(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    category = models.ForeignKey(Category, on_delete = models.CASCADE)
    liked = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='likes')

LIKE_CHOICES = (
    ('Like', 'Like'),
    ('Unlike', 'Unlike'),
)

class Like(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    value = models.CharField(choices=LIKE_CHOICES, max_length=8)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
 

Как бы я реализовал Ajax в этом? Я пытался искать учебные пособия, но не уверен, как адаптировать их к моему приложению. Любая помощь будет оценена.
Спасибо.

Ответ №1:

Ознакомьтесь с руководством: Как использовать AJAX с Django. Он проведет вас через процесс отправки AJAX-запросов в Django с использованием Jquery и ванильного JavaScript.

Вот что вам нужно сделать:

 class LikeArticleView(LoginRequiredMixin, View):
    def post(self, request, *args, **kwargs):
        article = Article.objects.get(pk=request.POST.get("id"))
        qs = article.liked.all()

        if request.user in qs:
            return HttpResponse("Already liked the article.")
        else:
            article.loved.add(request.user)
            return HttpResponse("You liked the Article")
 

При рендеринге шаблона статьи установите a data-id={{ article_id }} на кнопку «Мне нравится». Вы можете получить идентификатор статьи с помощью JavaScript, когда отправляете его как часть тела запроса POST. Это позволит вам выбрать нужную статью и обновить количество лайков.

Когда вы делаете запрос AJAX Post, вам необходимо установить заголовок токена CSRF; в противном случае Django выдаст сообщение об ошибке. В приведенном выше руководстве это описано.

Конечная точка, которую вы также отправили бы POST-запрос, будет:

 path('liked/', views.like_unlike_post, name='like-article-view'),
 

Вы можете вывести URL-адрес like в качестве атрибута данных, например, id выше, и захватить его с помощью JS.