首页 > 解决方案 > IndexError:反应窗格中的列表索引超出范围

问题描述

我正在制作像 Facebook 这样的反应窗格,它工作正常,但是当我尝试更新反应时,它会导致异常,例如"SyntaxError: Unexpected token < in JSON at position 0"

更新: 由于调试仍在继续,我取得了一些进展,这是第三次编辑。现在我修复了之前的错误并修复了 8 个问题。

在我views.py有一个新的错误react_type = [emoji_tuple[0] for emoji_tuple in React.choices if emoji_tuple[1] == body['emoji']][0] IndexError: list index out of range

这是我的models.py>>>

class React(models.Model):
    
    choices = [
        (1, "like"),
        (2, "dislike"),
        (3, "smile"),
        (4, "heart"),
        (5, "thanks")
    ]
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="reacted by")
    post = models.ForeignKey(UpPost, related_name="react", null=True, blank=True, on_delete=models.CASCADE)
    comment = models.ForeignKey(Comment, related_name="react", null=True, blank=True, on_delete=models.CASCADE)
    react_type = models.IntegerField(choices=choices, default=1)

    class Meta:
        verbose_name = "react"
        verbose_name_plural = "reacts"
        unique_together = [["user", "post"], ["user", "comment"]]
        ordering = ["react_type"]
    def __str__(self):
        elem = self.post if (self.post is not None) else self.comment
        return f"React {self.id} by {self.user} on object {elem}"

我的一个概念是elif request.method == "POST":,如果没有反应,我可能会在此块中进行检查。但具体该怎么做对我来说不是很清楚。

这是我的新views.py>>>

@login_required
def react(request, act, actId):
    if request.method == "GET":
        try:
            if act == "post":
                post = UpPost.objects.get(pk=actId)
                react_obj = React.objects.filter(user=request.user, post=post)
            elif act == "comment":
                comment = Comment.objects.get(pk=actId)
                react_obj = React.objects.filter(user=request.user, comment=comment)
            else:
                return JsonResponse({"error":_("Action not justified. You can not react anything except post or comment!")}, status=400)
        except ( UpPost.DoesNotExist, Comment.DoesNotExist ):
            return JsonResponse({"error":_("Post or comment may have deleted or removed")}, status=404)
        else:
            if len(react_obj) != 1:
                return JsonResponse({})
            react_obj = react_obj[0]
            return JsonResponse({"react":"True", "emoji": [emoji_tuple[1] for emoji_tuple in React.choices if emoji_tuple[0] == react_obj.react_type][0]}, status=200)
    elif request.method == "POST":
        body = json.loads(request.body)
        react_type = [emoji_tuple[0] for emoji_tuple in React.choices if emoji_tuple[1] == body['emoji']][0]
        try:
            if act == "post":
                post = UpPost.objects.get(pk=actId)
                react = React.objects.filter(user=request.user, post=post)
                if react:
                    react.delete()
                react_obj = React(user=request.user, post=post, react_type=react_type)
            elif act == "comment":
                comment = Comment.objects.get(pk=actId)
                react = React.objects.filter(user=request.user, comment=comment)
                if react:
                    react.delete()
                react_obj = React(user=request.user, comment=comment, react_type=react_type)
            else:
                return JsonResponse({"error":_("Action not justified. You can not react anything except post or comment")}, status=400)
        except ( UpPost.DoesNotExist, Comment.DoesNotExist ):
            return JsonResponse({"error":_("Post or comment may have deleted")}, status=404)
        react_obj.save()
        return HttpResponse(status=201)
    elif request.method == "PUT":
        body = json.loads(request.body)
        react_num = [emoji_tuple[0] for emoji_tuple in React.choices if emoji_tuple[1] == body['emoji']][0]
        try:
            if act == "post":
                post = UpPost.objects.get(pk=actId)
                old = React.objects.get(user=request.user, post=post)
            elif act == "comment":
                comment = Comment.objects.get(pk=actId)
                old = React.objects.get(user=request.user, comment=comment)
            else:
                return JsonResponse({"error":_("Action not justified. You can not react anything except post or comment.")}, status= 400)
        except ( UpPost.DoesNotExist, Comment.DoesNotExist ):
            return JsonResponse({"error":_("Post or comment may have deleted")}, status=404)
        if old.react_type != react_num:
            old.react_type = react_num
            old.save()
        return HttpResponse(status=201)

我错过了什么?任何帮助,将不胜感激!

标签: python-3.xdjangodjango-modelsdjango-views

解决方案


推荐阅读