TypeError statusText: «Внутренняя ошибка сервера» для простой функции «LIKE» в Django с использованием Ajax - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть простая запись, например, кнопка переключения, где пользователь может like опубликовать сообщение.Работает нормально, без добавления методов jQuery и Ajax.Однако мне нужно добавить Ajax для удаления обновления страницы.Ниже мой код, добавляющий Ajax и jQuery.Что я делаю не так?

Я добавил ошибку внизу, Там написано

Получен неожиданный аргумент ключевого слова 'username'

Какя могу это исправить?

мои модели

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts')        
    title = models.CharField(max_length=250, unique=True)
    slug = models.SlugField()
    message = models.TextField()       
    likes = models.ManyToManyField(User, blank=True, related_name='post_likes')

    def get_api_like_url(self):
       return reverse('posts:like_api', kwargs={'username': self.user.username,
                                         'slug': self.slug})

    def get_absolute_url(self):
       return reverse('posts:single', kwargs={'username': self.user.username,
                                           'slug': self.slug})

    def get_like_url(self):
       return reverse('posts:like', kwargs={'username': self.user.username,
                                         'slug': self.slug})

Мои взгляды

class PostLikeAPIToggle(APIView):
    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request, slug=None, format=None):
        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)
                liked = False
            else:
                obj.likes.add(user)
                liked = True
            data = {
                "post": obj,
                "liked": liked,
                "total_likes": obj.likes.all()
            }
            return Response(data)

В моем шаблоне у меня есть следующий код

<script>
    $(document).ready(function () {
        $(".like-btn").click(function (e) {
            e.preventDefault();
            var this_ = $(this);
            var likeUrl = this_.attr("data-href");
            $.ajax({
                url : likeUrl,
                method: "GET",
                data: {},
                success: function (data) {
                    console.log(data);
                    // $("#like-section").html(response)
                }, error: function (error) {
                    console.log("error");
                    console.log(error);
                }
            })
        })
    })
</script>

<div class="text-center">
{% if user in post.likes.all %}
    <a class="like-btn" data-href="{{post.get_api_like_url}}" href="{{post.get_like_url}}">
        <img src="{% static 'images/HEART.RED.png' %}" height="25px">
    </a><br/>
{% else %}
    <!--<a href=""><img src="{% static 'images/HEART.png' %}" height="25px"></a><br/>-->
    <a class="like-btn" data-href="{{post.get_api_like_url}}" href="{{post.get_like_url}}">
        <img src="{% static 'images/HEART.png' %}" height="25px">
    </a><br/>
{% endif %}

Ниже приведен мой URL для вызова кнопки «Мне нравится»

url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/like_api/$', views.PostLikeAPIToggle.as_view(), name='like_api'),

Ниже приведена ошибка, которую я получаю

responseText: «TypeError at / posts / charlize / singes-boat-new-york / like_api \ nget () получил неожиданный аргумент ключевого слова 'username' \ n \ nRequest Метод: GET \ nRequest URL:

1 Ответ

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

Ваш шаблон URL захватывает username и slug:

url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/like_api/$', views.PostLikeAPIToggle.as_view(), name='like_api')

Эти значения передаются в PostLikeAPIToggle, но его метод get не ожидает получения username.

Похоже, вам не нужно username, поскольку вы получаете пользователя из request.user в своем методе просмотра, поэтому я рекомендую изменить шаблон URL, чтобы не захватывать имя пользователя:

url(r'^[-\w]+/(?P<slug>[-\w]+)/like_api/$', views.PostLikeAPIToggle.as_view(), name='like_api')

Вы можете полностью удалить этот сегмент, что еще чище:

url(r'^(?P<slug>[-\w]+)/like_api/$', views.PostLikeAPIToggle.as_view(), name='like_api')

Другой вариант - обновить PostLikeApiToggle.get, чтобы принять username, но, поскольку вы не используете это значение, вероятно,не правильное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...