У меня в приложении есть функция нравится / не нравится в Django.Функция работает потрясающе сама по себе.Однако, когда я добавляю ajax к кнопке Like / Dislike, все обрывается, давая мне страницу не найдена Ошибка
Рабочий код без Ajax
Models.py
class Post(models.Model): #title, slug, message, etc exist but not included here
likes = models.ManyToManyField(User, blank=True, related_name='post_likes')
def get_absolute_url(self):
return reverse('posts:single', kwargs={'username': self.user.username,
'slug': self.slug})
def get_api_like_url(self):
return reverse('posts:like_post', kwargs={'username': self.user.username,
'slug': self.slug})
Views.py
class PostLikeToggle(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
slug = self.kwargs.get('slug')
print(slug) #Prints the slug
obj = get_object_or_404(Post, slug=slug)
url_ = obj.get_absolute_url()
user = self.request.user
if user.is_authenticated():
if user in obj.likes.all():
obj.likes.remove(user)
else:
obj.likes.add(user)
print(url_)
return url_
Шаблон:
<form action="{{post.get_api_like_url}}" method="post">
{% csrf_token %}
{% if user in post.likes.all %}
<button type="submit" name="post_slug" value="{{ post.slug }}" class="btn btn-link like_button">
<img class="like_heart" src="{% static 'images/HEART.RED.png' %}" height="25px">
</button>
{% else %}
<button type="submit" name="post_slug" value="{{ post.slug }}" class="btn btn-link like_button">
<img class="like_heart" src="{% static 'images/HEART.png' %}" height="25px">
</button>
{% endif %}
</form>
Urls.py
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/like_post/$', views.PostLikeToggle.as_view(), name="like_post")
- Все выше работает отлично
Я добавил Ajax. Ниже мой код после добавления AJAX, где я получаю страницу не найдена
Шаблон такой же, как выше
Модели такие же
Urls То же, что и выше
Views.py
class PostLikeToggle(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, *args, **kwargs):
slug = self.kwargs.get('slug')
print(slug)
obj = get_object_or_404(Post, slug=slug)
user = self.request.user
if user.is_authenticated():
if user in obj.likes.all():
obj.likes.remove(user)
else:
obj.likes.add(user)
context = {
"post": obj,
}
if self.request.is_ajax():
html = render_to_string("posts/like_section.html", context, request=self.request)
print(html) #This prints the html
print(JsonResponse({"form": html})) #This prints <JsonResponse status_code=200, "application/json">
return JsonResponse({"form": html})
Добавлен скрипт в базу.html
<script>
$(document).ready(function () {
$(".like_button").click(function (event) {
event.preventDefault();
var slug = $(this).attr("value"); #I have tried console.logging slug it works
$.ajax({
url : "{{post.get_api_like_url}}",
type: "POST",
data: {"slug": slug, "csrfmiddlewaretoken": "{{ csrf_token }}"},
dataType: "json",
success: function (data) {
$("#like-section").html(data["form"]);
console.log($("#like-section").html(data["form"]));
}, error: function (rs, e) {
console.log("error");
console.log(rs, e);
}
})
})
})
</script>
Терминал печатает все в представлении с печатью и затем выдает следующее
: [24 / Sep / 2018 00:23:10] "POST/ posts / charlize / singes-boat-new-york / like_post / HTTP / 1.1 "302 0
Не найдено: / posts / charlize / singes-boat-new-york / like_post / [24 / сен /2018 00:23:10] "GET / posts / charlize / singes-boat-new-york / like_post /% 3CJsonResponse% 20 status_code = 200 ,% 20% 22application / json% 22% 3E HTTP / 1,1 "404 7845

Примечание: если я обновляю страницу вручную, сработал переключатель Нравится / Не нравится