Usar exibições genéricas para exibir dados
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:
- Carregar o item do banco de dados pela ID.
- Se o item não for encontrado, retornar um erro 404.
- 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')