最佳方案处理django Http404(_("%(name)s object with primary key %(key)r does not exist.")% {"name": self.opts.verbose_name,"key": escape(id),})
报错的原因
这是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错误。
希望这些给出的示例和说明对您有帮助。