Как в Django View вызвать JavaScript функцию?

У меня есть view-функция, и в зависимости от определенных условий она либо что-то делает, либо запускает js функцию. Вот моя view:

def down_rating_article(request, article_id):
    if Article.objects.filter(pk=article_id).first() in request.user.article_left_reaction.all():
        'здесь нужно вызвать js'
    else:
        article = Article.objects.filter(pk=article_id).first()
        Article.objects.filter(pk=article_id).first().left_reaction.add(request.user)
        new_rating = article.rating - 1
        Article.objects.filter(pk=article_id).update(rating=new_rating)
        return redirect('article', article_id=article.pk)

Вопрос в том, как это сделать. В js я полный ноль, слышала про аякс, но не совсем понимаю, как с ним работать. Попыталась написать нужный мне js код. Вот он:

function change_rating_failed(object) {
    $.ajax({
        success: alert(`Вы уже поставили оценку ${object}!`)
   });
};

И теперь я в тупике, вообще не понимаю, что делать дальше


Ответы (1 шт):

Автор решения: user19315471

Нельзя наверняка сказать, как в данном случае сделать наиболее оптимально из-за недостатка подробностей и кода.
Вполне возможно, что так делать вообще не стоит, и лучше использовать другой подход.

Но один из вариантов решения этой проблемы - это добавлять контекст в шаблон. Затем JS будет считывать этот контекст. Если контекст имеется - JS срабатывает, иначе нет.

Пример:

urls.py:

from app.views import test

urlpatterns = [
    path('test', test),
]

views.py:

import random

def test(request, *args, **kwargs):
    template_context = {}
    if random.choice([True, False]):
        template_context.update({"test_value": "hello_world"})

    return render(
        request,
        "test.html",
        context=template_context
    )

templates/test.html:

<!DOCTYPE html>
<html lang="en">
<head>
  {{ test_value|json_script:"test-data" }}
</head>
<body>
</body>
<script>
if (JSON.parse(document.getElementById('test-data').textContent)) {
  alert('hello!')
}
</script>
</html>

При таких условиях JS на странице будет выполняться по случайному условию (random.choice).
Если контекст имеется - alert отобразится.

→ Ссылка