Можно ли как-то обращаться к функции, не используя urls?

Недавно я делал оценивание записей и столкнулся с проблемой редиректа, после нажатия на кнопку лайка, пользователя перенаправляло на url и связанную с ним функцию, после этого происходил ридерект обратно на главную страницу. Получается, что если пользователь слушал какую-либо музыку и в это время захотел оценить ее, главная страница обновлялась, следовательно аудиозапись прекращалась. Как можно реализовать это без редиректа и обновления?

urls.py

path('scoring/<str:pk>',  like_or_dislike, name='score'),
path('',main, name = 'main'),

views.py

def like_or_dislike(request, pk):
    
    liked = new_sg.objects.get(id=pk)
    if request.user in liked.like.all():
        liked.like.remove(request.user)
        liked.like_counts = liked.like_counts - 1
        liked.save()
    else:
        liked.like.add(request.user)
        liked.like_counts = liked.like_counts + 1
        liked.save()
    return HttpResponseRedirect('/')

def main(request):
	
    track = new_sg.objects.all()
    #take = new_sg.objects.get(pk = new_sg_id)
    genre = rub.objects.all()
    user_on = User.objects.all()
    context = {'track' : track,'user_on':user_on,'genre' : genre,}
    return render(request,'main/main.html',context)

models.py

class new_sg(models.Model):
	song = models.CharField(max_length = 50,verbose_name = "Название трека:")
	opis = models.ForeignKey('opisan', on_delete = models.DO_NOTHING, default='', null=False, blank = False)
	text = models.TextField(verbose_name='Описание к песне, Ваши соцести и прочее...', default='', )
	artist = models.ForeignKey(User,on_delete = models.CASCADE,verbose_name = 'Артист',null = False,blank = False,default = '',related_name = 'author')
	published = models.DateTimeField(auto_now_add = True,db_index = True,verbose_name = 'Дата публикации')
	add_mus = models.FileField(upload_to = 'arch/for_main',verbose_name = 'Файл', null = False,blank = False,default = '')
	genre = models.ForeignKey('rub', null = False,on_delete = models.PROTECT,verbose_name = 'Жанр',default = '')
	views = models.IntegerField(default = 0)
	potr = models.ManyToManyField(User,through = 'UserSongRalation',related_name = 'potr')
	like = models.ManyToManyField(User, blank=True)
	like_counts = models.IntegerField(default=0)

urls не виноват, просто так работают браузеры: HTTP запросы отправляются серверу только при открытии страницы или отправке формы.

В 90-х этого хватало, но лет 15-20 назад люди поняли, что это не всегда удобно, стали развивать JavaScript и отправлять HTTP запросы через него.
Обычно это называют AJAX.

google.com/search?q=django+ajax

То есть это REST веб-службы?

Ну это по-разному называть и реализовывать можно.

Суть в том, что надо отправить HTTP запрос JavaScript’ом.
Можно даже на тот же адрес/обработчик, что сейчас, не меняя ничего в коде серверной части. Просто скрипту нет никакой пользы ни от редиректа, ни от отдаваемой HTML страницы. Если нужно проверить успешность операции, то в ответ скрипту удобно отдавать JSON со статусом и прочей нужной инфой.

1 лайк