python-3.x - 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)
我错过了什么?任何帮助,将不胜感激!
解决方案
推荐阅读
- c# - 如果我不需要结果值,哪个更有效:线程或任务?
- stripe-payments - 什么是 batch.created 和 batch.updated webhook 事件?
- spring-batch - Spring Batch 元数据数据库事务问题
- regex - 匹配的花括号之间的 sed 匹配
- python - 关于在python中打乱列表的问题
- reactjs - 反应:用状态和钩子创建动态组件?
- beagleboneblack - beagle bone black 中的 SYS_BOOT 寄存器是什么?SYS_BOOT[4:0] 、 SYS_BOOT[15:0] 、 SYS_BOOT[15:14] 寄存器的意义是什么?
- sql - 按和 FOR XML PATH 分组
- amazon-web-services - 如何在 dynamodb 表中包含非键属性并使用 batch_writer 为其赋值?
- java - 注册后如何修复向多对多添加实体