首页 > 解决方案 > Django:处理用户输入错误的 URL 模式导致 404 的情况

问题描述

如何防止用户输入数据库中不存在的 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
    )

标签: django

解决方案


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 %}入您的模板,并显示合适的错误消息。


推荐阅读