如何在Django中使用字符串字段值作为URL参数,并验证它们的存在或为404服务?

2024-04-28 07:49:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有

def manufacturer(request, manufacturer_title):
#try:
#    m = Manufacturer.objects.filter(title__iexact=manufacturer_title)
#except Manufacturer.DoesNotExist:
#    raise Http404("No such manufacturer")
return HttpResponse("Manufacturer: %s" % manufacturer_title)
#return HttpResponse("Manufacturer: %s" % m.title)

你可以看到我在这里想做什么。只有倒数第二行没有注释掉,这适用于为manufacturer_title输入的任何值,并以键入方式打印,无论其是否有效。然而,很明显,我需要它来匹配现有的制造商。如果我取消注释上面注释的行(不包括最后一行),服务器将无法连接


Tags: returnobjectstitlerequestdeffilterraisetry
2条回答

过滤器不会引发异常。可能您正在尝试获取一个独特的对象,可以使用get这样做:

  Manufacturer.objects.get(title__iexact=manufacturer_title)

现在,如果对象不存在,get将引发异常

您在案例中所需的功能也可以通过快捷方式完成。这样地: 如果需要单个对象:

 from django.shortcuts import get_object_or_404

 def manufacturer(request, manufacturer_title):
      m = get_object_or_404(Manufacturer, title__iexact=manufacturer_title)
      return HttpResponse("Manufacturer: %s" % manufacturer_title)

如果需要查询集:

   from django.shortcuts import get_list_or_404

   def manufacturer(request, manufacturer_title):
      m = get_list_or_404(Manufacturer, title__contains=manufacturer_title)
      return HttpResponse("Manufacturer: %s" % manufacturer_title)

Djangofilter未引发DoesNotExists错误。 您可以将代码重写为:

def manufacturer(request, manufacturer_title):
    m = Manufacturer.objects.filter(title__iexact=manufacturer_title)
    if not m.exists():
        raise Http404("No such manufacturer")
    return HttpResponse("Manufacturer: %s" % manufacturer_title)

或者,如果title是uqique字段,您可以只使用get()

  try:
       m = Manufacturer.objects.get(title__iexact=manufacturer_title)
  except Manufacturer.DoesNotExist:
       raise Http404("No such manufacturer")
  return HttpResponse("Manufacturer: %s" % m.title)

相关问题 更多 >