как показать персонализированную ошибку с get_object_or_404 - PullRequest
9 голосов
/ 14 июля 2010

я хотел бы знать, как показывать персонализированную ошибку с get_object_or_404 ?, я не хочу нормальные страницы http404, я хочу отобразить сообщение с результатом none

спасибо:)

Ответы [ 4 ]

15 голосов
/ 14 июля 2010

get_object_or_404() по сути простая 5-строчная функция. Если у вас нет особых причин для его использования, просто выполните:

try:
    instance = YourModel.objects.get(pk=something)
except YourModel.DoesNotExist:
    return render_to_response('a_template_with_your_error_message.html')

Если по какой-либо причине у вас есть для использования get_object_or_404 (), вы можете попробовать поместить его в блок try: ... except Http404: ..., но я, честно говоря, не могу придумать вероятную причину для этого.

3 голосов
/ 21 апреля 2015

Как сказал Майкл, при использовании get_object_or_404 вы не можете настроить сообщение, указанное на http 404. Однако в сообщении, представленном в DEBUG, содержится информация об исключении: «Ни один MyModel не соответствует данному запросу».

Проверьте документ по этому вопросу.Есть три аргумента: модель, * args и ** kwargs.Последние два используются для построения аргумента для get () или filter () в Model.

Однако я написал причину для решения вопроса о том, почему мы хотели бы использовать вспомогательную функцию.например, get_object_or_404 () вместо того, чтобы, например, перехватить его с исключением, как Model.DoesNotExist.

Более позднее решение связывает слой вида со слоем модели.Чтобы ослабить эту связь, мы можем использовать управляемую связь, предлагаемую в модуле django.shortcuts [1] .

2 голосов
/ 14 июля 2010

И почему именно вы не используете возможности вашего сервера для этого?
get_object_or_404() перенаправляет на страницу 404 по умолчанию, верно?
Если вы находитесь в режиме отладки, вы не увидите его, но при развертывании django будет просто ссылаться на страницу 404 html сервера.

2 голосов
/ 14 июля 2010

Это невозможно сделать с помощью этого ярлыка. Это может вызвать только исключение Http404. Лучше всего попытаться поймать, если вы хотите получить полный контроль. Например.

try:
    obj = Model.objects.get(pk = foo)
except:
    return HttpResponseRedirect('/no/foo/for/you')
    #or
    return render_to_response ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...