Django: обработка случаев, когда пользователь вводит неправильные шаблоны URL, что приводит к 404 - PullRequest
0 голосов
/ 17 мая 2019

Как я могу запретить пользователю вводить в URL значения, которых нет в базе данных. Например, у автомобилей есть идентификатор, поэтому переход к машине будет http://127.0.0.1:8000/car/1, и если пользователь вводит идентификатор, который не существует, он возвращает 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 Ответ

1 голос
/ 17 мая 2019
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 вместо сбоя, когда объект не существует.Вы увидите только настоящую страницу 404, когда DEBUG = False в ваших настройках.Если у вас есть 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 %} в своем шаблоне и отобразить подходящее сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...