Ни один url не отвечает при выполнении ajax-запроса post в Django
Здравствуйте, я пытаюсь реализовать функцию like на видео в django с помощью ajax. Но когда я нажимаю на иконку like, сервер не пытается отправить данные по какому-либо url и не показывает ни ошибки, ни успешной попытки. Таким образом, количество лайков остается неизменным.
views.py
class DetailVideo(View):
def get(self, request, pk, *args, **kwargs):
video = Video.objects.get(pk=pk)
form = CommentForm()
comments = Comment.objects.filter(video=video).order_by('-created_on')
categories = Video.objects.filter(category=video.category)[:15]
context = {
'object': video,
'comments': comments,
'form': form,
'categories': categories
}
return render(request, 'courses/detail_video.html', context)
def post(self, request, pk, *args, **kwargs):
video = Video.objects.get(pk=pk)
form = CommentForm(request.POST)
if form.is_valid():
comment = Comment(
user=self.request.user,
comment=form.cleaned_data['comment'],
video=video
)
comment.save()
comments = Comment.objects.filter(video=video).order_by('-created_on')
categories = Video.objects.filter(category=video.category)[:15]
context = {
'object': video,
'comments': comments,
'form': form,
'categories': categories
}
return render(request, 'courses/detail_video.html', context)
class Like(View):
def post(self, request, *args, **kwargs):
if request.POST.get('action') == 'post' and request.is_ajax():
result = ''
pk = int(request.Post.get('videoid'))
video = get_object_or_404(Video, pk = pk)
if video.likes.filter(pk=request.user.pk).exsits():
video.likes.remove(request.user)
video.like_count -= 1
result = video.like_count
video.save()
else:
video.likes.add(request.user)
video.like_count += 1
result = video.like_count
video.save()
return JsonResponse({'result': result})
urls.py
app_name = "courses"
urlpatterns = [
path('', views.Index.as_view(), name = "home"),
path('user-uploads/<str:username>', views.UserUploads.as_view(), name = "user-uploads"),
path('create-video', CreateVideo.as_view(), name='video-create'),
path('<int:pk>/', DetailVideo.as_view(), name='video-detail'),
path('<int:pk>/update-video', UpdateVideo.as_view(), name='video-update'),
path('<int:pk>/delete-video', DeleteVideo.as_view(), name='video-delete'),
path('category/<int:pk>', VideoCategoryList.as_view(), name='category-list'),
path('search/', views.VideoSearch.as_view(), name='search-list'),
path('like/', views.Like.as_view(), name='like'),
]
script.js
$(document).on('click', '#like-button', function (e) {
e.preventDefault();
$.ajax({
type: 'POST',
url: '{% url "courses:like" %}',
dataType: 'json',
data: {
videoid: $('#like-button').val(),
csrfmiddlewaretoken: '{{ csrf_token }}',
action: 'post'
},
success: function (json) {
document.getElementById("like-count").innerHTML = json['result']
},
error: function(xhr,errmsg,err) {
console.log(xhr.status + ": " + xhr.responseText);
}
});
});
detail_video.html
<h5 class="mt-4">{{ object.caption }}</h5>
<div class="row">
<div class="col-md-6 text-muted">
<p>{{ object.date_time | date:"M d, Y" }}</p>
<a class="category-link" href="{% url 'courses:category-list' object.category.pk %}">{{ object.category }}</a>
</div>
<div class="col-md-6 text-muted text-right">
{% if request.user.is_authenticated %}
<span class="" id="like-count">{{ object.like_count }}</span>
<button type="submit" class="btn btn-outline-light btn-outline-dark" id="like-button" value="{{ object.pk }}">
<ion-icon name="thumbs-up-sharp"></ion-icon>
</button>
{% endif %}
</div>
</div>
models.py
class Video(models.Model):
uploader = models.ForeignKey(User, on_delete=models.CASCADE)
caption = models.CharField(max_length=100)
video_description = models.TextField()
video_file = models.FileField(upload_to="courses/video_files", validators=[FileExtensionValidator(allowed_extensions=['mp4'])])
thumbnail = models.FileField(upload_to="courses/thumbnails", validators=[FileExtensionValidator(allowed_extensions=['png', 'jpg', 'jpeg'])])
date_time = models.DateTimeField(default=timezone.now)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
likes = models.ManyToManyField(User, related_name='like', default='None', blank=True)
like_count = models.BigIntegerField(default='0')
def __str__(self):
return self.caption