Usar exibições genéricas para exibir dados

Concluído

O sistema de exibições genéricas do Django simplifica a criação de código repetitivo. As operações comuns que você executa em um aplicativo controlado por dados têm o mesmo padrão. Por exemplo, para exibir um item individual pela ID ou pela chave primária, o fluxo de trabalho é sempre:

  1. Carregar o item do banco de dados pela ID.
  2. Se o item não for encontrado, retornar um erro 404.
  3. Se o item for encontrado, transmiti-lo para um modelo para exibição.

O sistema de exibição genérica reconhece esse fato e fornece classes que podem ser usadas que já contêm o código básico escrito. Você herda da classe apropriada, define algumas propriedades e registra um caminho apropriado na URLconf. O restante é feito para você.

O Django inclui duas exibições genéricas para exibir os dados: DetailView e ListView.

DetailView para detalhes do item

A exibição genérica DetailView é usada para exibir uma página de detalhes de um item. DetailView recupera o item para o model especificado pela chave primária e transmite-o para o modelo. Você pode definir template_name como o nome do modelo a ser usado. O padrão é <model>_detail.html. Por fim, podemos definir context_object_name como o nome da variável que desejamos usar no modelo.

Para criar uma exibição de detalhes usando a exibição genérica para um cão, você poderá usar o seguinte código:

from . import models
from django.views import generic

class DogDetailView(generic.DetailView):
    model = models.Dog
    template_name = 'dog_detail.html'
    context_object_name = 'dog'

O registro de DogDetailView é semelhante a qualquer outra entrada path. O importante é incluir um parâmetro chamado pk. O Django usa essa convenção para identificar a chave primária. Você também observará que usamos o método as_view() para converter a classe em uma exibição.

path('dog/<int:pk>', views.DogDetailView.as_view(), name='dog_detail')

ListView para uma lista de itens

A exibição genérica ListView se comporta de maneira semelhante a DetailView. Você pode definir context_object_name para o nome da variável na exibição e template_name para o nome do modelo.

A principal diferença é que ListView foi projetado para funcionar com qualquer forma de uma consulta que retorne vários itens. Como resultado, você precisará substituir a função get_queryset. A função get_queryset é chamada pelo sistema de exibição genérica para recuperar os itens do banco de dados, o que permite que você ordene ou filtre os itens conforme necessário.

Para criar uma exibição para exibir a lista de todos os abrigos para cães usando a exibição genérica ListView, você poderá usar o seguinte código:

from . import models
from django.views import generic

class ShelterListView(generic.ListView):
    template_name = 'shelter_list.html'
    context_object_name = 'shelters'

    def get_queryset(self):
        return models.Shelter.objects.all()

O registro da exibição é executado da mesma forma que o DetailView.

path('', ShelterListView.as_view(), name='shelter_list')