Страница не найдена ошибка при попытке использовать Ajax на Django Post LIKE DISLIKE - PullRequest
0 голосов
/ 22 сентября 2018

У меня в приложении есть функция нравится / не нравится в 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

enter image description here

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

1 Ответ

0 голосов
/ 24 сентября 2018

Вы реализуете метод get_redirect_url.Независимо от того, что возвращает этот метод, мы воспринимаем его как URL для перенаправления браузера.Функция JsonResponse возвращает объект с данными ответа.Но так как это get_redirect_url, Django считает, что это строка с URL.

Вместо этого реализуйте метод post и вручную верните HttpResponseRedirect, если это обычный запрос, и JsonResponse если это AJAX-запрос.

Еще одна вещь: вы используете LoginRequiredMixin mix-in.Нет необходимости проверять user.is_authenticated в представлении.

class PostLikeToggle(LoginRequiredMixin, RedirectView):
    def post(self, *args, **kwargs):
        slug = self.kwargs.get('slug')
        obj = get_object_or_404(Post, slug=slug)
        user = self.request.user
        context = {"post": obj}

        if user in obj.likes.all():
            obj.likes.remove(user)
        else:
            obj.likes.add(user)

        if self.request.is_ajax():
            html = render_to_string("posts/like_section.html", context, request=self.request)
            return JsonResponse({"form": html})

        url = obj.get_absolute_url()
        return HttpResponseRedirect(url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...