【问题标题】:when I try to delete object I get "list out of index range" error当我尝试删除对象时,出现“列表超出索引范围”错误
【发布时间】:2013-12-04 18:08:47
【问题描述】:

这是我的 delete_category 函数:

def delete_category(request, id):
    user = request.user
    category = Category.objects.get(pk=id)
    category.user.remove(user)
    return HttpResponseRedirect(reverse('auth_profile', args=[user.username]))

这是我的 category_detail 函数:

def category_detail(request, category_name):
    user = request.user
    category = Category.objects.filter(name=category_name, user__username=user)[0]
    return render_to_response("category_detail.html", { "category":category}, context_instance=RequestContext(request))

这是 category_detail.html:

        <p>{{category.name}}</p>
        <a href="{% url 'delete_category' category.id %}">delete</a>

如果我有多个类别,我可以在单击删除链接时删除。但如果我只有一个类别,我会收到此错误:

list index out of range

【问题讨论】:

  • 你把delete_category函数放在哪里了?
  • 为了您未来的理智,不要让GET 请求修改您的数据库!那样会产生可怕的、可怕的副作用。见stackoverflow.com/questions/705782/…。也就是说,您如何链接到您的category_detail 视图?另外,您可以仔细检查您发布的代码吗?就目前而言,您的视图函数采用参数shelf_name,但引用了一个未声明的变量category_name。假设这不是一个实际错误,如果 user 和 category_name 对不匹配对象,该视图将抛出该异常。
  • 非常感谢我会更加小心

标签: python django list orm


【解决方案1】:

改变

category = Category.objects.filter(name=category_name, user__username=user)[0]

通过

categories = Category.objects.filter(name=category_name, user__username=user)
category = None
if categories:
   category = categories[0]

另请参阅如何正确使用 QuerySet 对象here

【讨论】:

    【解决方案2】:

    您的代码有点难以理解,我怀疑这不是确切代码,但没关系。

    列表索引超出范围是指您指定的...[0]

    您可能想要重写您必须更好地处理零类别的内容,但快速解决方法是:

    try:
        category = Category.objects.filter(name=category_name, user__username=user)[0]
    except:
        category = None
    ...
    

    【讨论】:

    • 现在我得到 Reverse for 'delete_category' 参数 '('',)' 和关键字参数 '{}' 未找到。我很困惑。
    • 这太疯狂了,因为如果我有多个类别,我可以删除,但如果我只有一个类别,我就会出错。
    • 你需要重写你的代码以更好地处理你有一个或零个类别的情况
    • 如果没有传入类别,您会得到{% url 'delete_category' %}...您应该用模板语言编写一个 if 语句...
    • 当我在 A category_detail_page 上时,如果我尝试删除此页面,则会出错。
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2020-09-04
    相关资源
    最近更新 更多