Django:处理用户输入错误网址格式导致404的情况

时间:2019-05-17 09:48:52

标签: django

如何防止用户输入数据库中不存在的url值。例如,汽车有一个ID,因此导航到汽车将是 http://127.0.0.1:8000/car/1,如果用户输入的ID不存在,则返回404,我该如何处理?

urlpatterns = [
    path('', include('index.urls')),
    path('cars/', include('car.urls')),
    path('users/', include('user.urls')),
    path('admin/', admin.site.urls),
]

这是我的“汽车”视图的一部分,因为我也有search_car,而且很长:

def get_car_by_id(request, id):
    cars = Car.objects.all()
    car_types = CarCategory.objects.all()
    context = {'apartments': apartments, 'car_types': car_types,
               'car': get_object_or_404(Car, pk=id)}
    return render(
        request, 'car/single_car.html', context
    )

1 个答案:

答案 0 :(得分:1)

def get_car_by_id(request, id):
    cars = Car.objects.all()
    car_types = CarCategory.objects.all()
    context = {'apartments': apartments, 'car_types': car_types,
               'car': get_object_or_404(Car, pk=id)}
    return render(
        request, 'car/single_car.html', context
    )

您正在使用get_object_or_404快捷方式。这是一种常见的方法,这意味着Django将显示404页面,而不是在对象不存在时崩溃。在设置中DEBUG = False时,您只会看到真正的404页面。如果您拥有DEBUG = True,则将看到黄色的404页面,以帮助调试问题。

如果您确实不想显示404页面,则不应使用get_object_or_404。您可以改为捕获DoesNotExist异常。

def get_car_by_id(request, id):
    cars = Car.objects.all()
    car_types = CarCategory.objects.all()
    try:
        car = Car.objects.get(pk=id)
    except Car.DoesNotExist:
        car = None
    context = {'apartments': apartments, 'car_types': car_types,
               'car': car }
    return render(
        request, 'car/single_car.html', context
    )

现在,您可以在模板中检查{% if car %},并显示适当的错误消息。