您的位置:

最佳方案处理django Http404(_("%(name)s object with primary key %(key)r does not exist.")% {"name": self.opts.verbose_name,"key": escape(id),})

  发布时间:2023-04-01 07:44:35
报错的原因这是Django中的一个HTTP错误。这意味着Django在数据库中找不到与给定主键对应的对象。如何解决这个错误可以在代码中通过 try-except 语句捕获并处理。在视图函数中使用这样Django会自动帮你检查是否存在这个对象。此外还可以使用 get_list_or_404() 方法来捕获 DoesNotExist 异常,该方法与类似,但是用于查询结果集的情况。

报错的原因

这是Django中的一个HTTP404错误。这意味着Django在数据库中找不到与给定主键(或其他唯一标识符)对应的对象。这可能是由于您试图访问不存在的对象或者数据库中记录已经删除。

如何解决

这个错误可以在代码中通过 try-except 语句捕获并处理。在视图函数中使用 get_object_or_404(),这样Django会自动帮你检查是否存在这个对象。如果不存在,它会返回HTTP404错误。如果你想自己捕获并处理这个错误, 可以使用 Model.DoesNotExist 异常。

你可以使用get()或filter()来查询对象,如果不存在,可以返回一个特殊页面或者其他错误处理

代码示例:


from django.shortcuts import render, get_object_or_404
from .models import YourModel

def your_view(request, id):
    object = get_object_or_404(YourModel, pk=id)
    # or 
    try:
        object = YourModel.objects.get(pk=id)
    except YourModel.DoesNotExist:
        return render(request,'404.html')

使用例子

下面是一个示例,在这个例子中,我们捕获DoesNotExist异常并使用render函数返回HTTP404错误。


from django.shortcuts import render
from .models import MyModel

def my_view(request, id):
    try:
        my_object = MyModel.objects.get(pk=id)
        return render(request, 'my_template.html', {'object': my_object})
    except MyModel.DoesNotExist:
        return render(request, '404.html', status=404)

或者你可以使用get_object_or_404()快捷方式来达到相同的效果


from django.shortcuts import render, get_object_or_404
from .models import MyModel

def my_view(request, id):
    my_object = get_object_or_404(MyModel, pk=id)
    return render(request, 'my_template.html', {'object': my_object})

注意:在这两个示例中,我们使用pk作为查询参数,因为它是Django模型中默认使用的主键字段。如果您的模型使用其他字段作为主键,请使用该字段替换pk

在上面的示例中,当查询的对象不存在时,get()方法会抛出 MyModel.DoesNotExist 异常,那么我们在视图函数中使用try-except语句捕获这个异常,并返回一个404错误页面。

此外还可以使用 get_list_or_404() 方法来捕获 DoesNotExist 异常,该方法与 get_object_or_404() 类似,但是用于查询结果集的情况。

或者如果你想自定义错误页面,可以在urls.py 中使用 handler404 指定一个视图函数来处理404错误。

希望这些给出的示例和说明对您有帮助。