TypeError statusText:"Internal Server Error" 用于使用 Ajax 的 Django 中的简单帖子"LIKE"功能



我有一个简单的帖子,比如切换按钮,用户可以在其中like帖子。它无需添加jQuery和Ajax方法即可正常工作。但是我需要添加 Ajax 来删除页面刷新。下面是我添加Ajax和jQuery的代码。我做错了什么?

我已将错误添加到底部,它说

有一个意外的关键字参数"用户名">

我该如何解决这个问题?

我的模型是

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(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_apiget((得到一个意外的关键字参数'username'\Request Method: GETRequestURL:

您的URL模式捕获usernameslug

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,但由于您没有使用该值,因此可能不是正确的决定。

最新更新