Como exibir a mensagem passada para Http404 em um modelo de erro 404 personalizada em Django?

StackOverflow https://stackoverflow.com/questions/1621173

Pergunta

Eu tenho um projeto que eu estou trabalhando em no Django. Há uma série de casos em que I:

raise Http404("this is an error")

e cria uma boa página 404 para mim com a mensagem de erro "este é um erro" escrito nele.

Agora eu quero criar uma página de erro personalizada e têm ainda exibir a mensagem, mas eu não consigo descobrir como.

Eu tenho certeza que é apenas uma variável de modelo que eu preciso adicionar ao meu modelo personalizado 404, mas não consigo encontrar qualquer documentação para ele.

Foi útil?

Solução

A partir de Django 1.9, a exceção é passado para o page_not_found vista que é executado quando você levanta Http404. Uma representação do erro é passado para o modelo, você pode incluí-lo em seu modelo com:

{{ exception }}

Em versões anteriores, a exceção não foi passado para a visão page_not_found, então não havia uma maneira fácil de incluir a mensagem de exceção no modelo.

Uma possibilidade era usar a estrutura mensagens como @Euribates sugere na sua resposta. Outro era o de tornar um modelo e retornar um código de status 404 na sua opinião, em vez de elevar Http404.

Outras dicas

Não há outra maneira. O código na page_not_found usa RequestContext; Isso significa que você tem acesso a todas as variáveis ??definidas por todos os processadores contexto definido na entrada TEMPLATE_CONTEXT_PROCESSORS em settings.py. O valor padrão inclui, entre outros, o Django mensagens quadro.

Assim, você con definir a mensagem que você quer mostrar usando messages.error, por exemplo, e mostrar a mensagem no modelo usando a variável messages.

Em outras palavras, você pode escrever a sua visão como esta:

from django.contrib import messages
from django.http import Http404
from django.template import RequestContext

def my_view(request):
    # your code goes here
    if something_horribly_wrong_happened():
        messages.error(request, 'Somethig horribly wrong happened!')
        raise Http404("It doesn't mind whatever you put here")
    else:
        return render_to_response(
            'template.html',
            RequestContext(request, locals()),
            )

No seu modelo 404.html, você deve escrever algo como:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

É um pouco mais complexo, mas tem a vantagem que você pode enviar várias mensagens, e até mesmo usar tipo diferent de mensagens (Aviso, Debug, Info, Error, etc ...) Você pode ler mais sobre a estrutura mensagem django aqui: O quadro de mensagens | Django Documentação .

eu tenho a solução mais simples

Basta escrever middleware, que levaria o seu texto de erro em alguma variável pedido. Veja o exemplo

from django.http.response import Http404

class Error404Middleware(object):
    def process_exception(self, request, exception):
        if isinstance(exception, Http404):
            request.error_404_message = exception.message

Em 404.html

{{ request.error_404_message }}

{{ exception }}

A partir de 1.9.6, a mensagem passada para:

raise Http404('msg')

está disponível a partir templates/404.html como:

{{ exception }}

Fonte: https: // github. com / django / django / blob / 1.9.6 / django / views / defaults.py # L20

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top