Introdução às vistas
Na programação, um modo de exibição normalmente é um componente que exibe informações para o usuário. As tarefas que um modo de exibição executa podem variar dependendo da estrutura e das convenções, incluindo a responsabilidade pelo carregamento de dados.
No Django, uma visualização é normalmente responsável por:
- Validando a solicitação de um usuário.
- Carregar ou modificar os dados apropriados.
- Retornando um modelo HTML com as informações para o usuário.
Vamos começar nossa exploração discutindo a criação manual de visualizações e a configuração dos URLconfs apropriados. Um URLconf é uma lista de caminhos que indicam o padrão a ser correspondido, a função a ser chamada e, opcionalmente, um nome. Em uma unidade posterior, veremos como o Django pode lidar automaticamente com parte do código que escrevemos à mão.
Criar uma vista
Para criar uma exibição do zero no Django, você normalmente cria uma função. A função geralmente contém o código apropriado para:
- Execute a tarefa que o usuário solicitou.
- Retornar um modelo com os dados apropriados para exibir ao usuário.
As funções de exibição sempre usam pelo menos um parâmetro chamado request
, que representa a solicitação do usuário. Você pode fornecer mais parâmetros, conforme necessário, se estiver esperando mais informações do usuário na URL, como o nome ou a ID de um item. Você irá registrá-los ao criar a rota, sobre a qual falaremos mais adiante na unidade.
Carregar dados
Você pode usar o Django ORM para carregar todos os dados que você precisa do banco de dados registrado.
O projeto que estamos construindo tem dois modelos, Shelter
e Dog
. Podemos carregar todos os objetos ou executar outras consultas usando os modelos que criamos. Para carregar todos os abrigos, por exemplo, usaríamos Shelter.objects.all()
. Podemos carregar um abrigo individual usando Shelter.objects.get(pk=1)
.
Nota
pk
é um atalho para a chave primária. Você pode usar id
e ter o mesmo resultado, mas usar pk
garantirá que o comando funcione se você tiver alterado a propriedade que representa a chave primária para um nome diferente.
404 erros
Um erro 404 em aplicativos Web significa "não encontrado". Como prática recomendada, você deve retornar um 404 sempre que uma solicitação for feita para um objeto que não existe.
O Django fornece atalhos para tentar carregar dados:
get_object_or_404
eget_list_or_404
: Carrega um objeto por uma chave primária ou retorna um 404 para o usuário se um objeto não for encontrado.get_list_or_404
: Executa a mesma operação que o outro atalho, exceto que aceita um parâmetro de filtro.
Vamos usar get_object_or_404
no nosso exercício.
Renderizando o modelo
O mecanismo de modelagem do Django pegará o modelo HTML que construímos, combiná-lo-á com quaisquer dados que fornecermos e emitirá o HTML para o navegador. A função auxiliar para executar esta tarefa é render
.
A render
função precisa do objeto que representa a solicitação, que é o request
parâmetro que destacamos anteriormente. Você também passa o nome do modelo, normalmente um arquivo HTML que residirá em uma pasta chamada templates.
Para passar dados para o modelo, forneça render
um context
objeto de dicionário. O context
objeto contém um conjunto de pares chave/valor, onde cada chave se torna uma variável no modelo.
Exemplo
Para criar uma exibição para exibir todos os abrigos, você pode usar o seguinte código:
def shelter_list(request):
shelters = Shelter.objects.all()
context = { 'shelters': shelters }
return render(request, 'shelter_list.html', context)
Registrar um caminho
Quase todos os frameworks da Web usam caminhos para processar solicitações de usuários. Os caminhos convertem a parte da URL após o nome do domínio e antes da cadeia de caracteres de consulta (que vem após o ponto de interrogação) em uma chamada de função.
Uma chamada para www.contoso.com/shelters
pode chamar uma função para listar todos os abrigos, enquanto www.contoso.com/shelters/1
pode chamar uma função para exibir um abrigo com um ID de 1. Você registra caminhos no Django criando um URLconf.
Digamos que temos um módulo chamado views
, que é uma convenção Django. Podemos rotear o tráfego de índice onde um caminho não é especificado (como www.contoso.com
) para uma função chamada views
index
, e dar-lhe um nome chamado index
, usando o seguinte caminho:
path('', views.index, 'index')
Também podemos criar pastas virtuais para pedidos específicos. Por exemplo, se quiséssemos listar todos os abrigos se alguém solicitar /abrigos, poderíamos usar o seguinte comando:
path('shelters', views.shelter_list, 'shelter_list')
Parâmetros de URL
É uma prática comum passar parâmetros para um aplicativo como parte da URL, como um ID ou um nome. Como esses valores mudarão, não queremos codificá-los em nosso caminho. No Django, você pode especificar um parâmetro usando uma sintaxe especial. Nessa sintaxe, você pode indicar o tipo de dados esperados, como um inteiro e um nome.
Por exemplo, para criar um caminho para alguém solicitar um abrigo específico por um ID, gostaríamos de um parâmetro do tipo integer
. (A razão é que nossa chave primária é um inteiro.) Podemos então fornecer o nome que queremos usar para a variável, que será então passado como um parâmetro para a função view. A sintaxe para identificar esse parâmetro seria <int:pk>
. Observe a declaração de tipo, os dois pontos e, em seguida, o nome da variável.
O caminho completo pode ter esta aparência:
path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')
A função de exibição associada teria a seguinte assinatura:
def shelter_detail(request, pk):
# code
A pk
parte da assinatura do caminho é passada como shelter_detail
um parâmetro, como se estivéssemos chamando-a como uma função Python normal.