DetailView
Parte da seção Views baseadas em classes do Journey de Django da Coddy. Lição 5 de 18.
Cada trabalho precisa de uma página própria: encontre o trabalho, exiba-o e responda com 404 Página não encontrada quando não houver esse trabalho. Isso é DetailView. Em um site de receitas:
class RecipeDetailView(DetailView):
model = Recipe
# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")Uma DetailView lê a chave primária do registro a partir do argumento da URL chamado pk e procura o registro da mesma forma que get_object_or_404(). Seu template padrão é recipes/recipe_detail.html, e o registro é disponibilizado como object e como recipe.
O nome pk é importante. Uma rota escrita como <int:id> fornece à view um argumento que ela não procura, e a página falha com um AttributeError solicitando um pk ou um slug do objeto.
Um link passa o pk do registro para o nome da rota: {% url 'recipes:recipe' recipe.pk %}.
Desafio
FácilDê a cada vaga sua própria página, usando o modelo pronto jobs/job_detail.html.
- Em
jobs/views.py, adicioneJobDetailView, umaDetailViewdeJob. - Em
jobs/urls.py, adicione a rota"jobs/<int:pk>/"chamadadetail. - Em
job_list.html, transforme o título de cada vaga em um link para sua página.
Clique em Python Developer para abrir sua página e, em seguida, abra /jobs/999/: você verá 404 Página não encontrada.
Experimente você mesmo
from django.views.generic import ListView, TemplateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Views baseadas em classes
Pratique por conta própria: Playground de Django