Resumo : neste tutorial, você aprenderá como usar a DetailView
classe Django para exibir um objeto.
Este tutorial começa onde o tutorial Django ListView parou.
Definindo um DetailView
O Django DetailView
permite definir uma visão baseada em classe que exibe os detalhes de um objeto. Para usar a DetailView
classe, você define uma classe que herda da DetailView
classe.
Por exemplo, o seguinte define a TaskDetail
visualização baseada em classe que exibe os detalhes de uma tarefa do aplicativo Todo :
from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from .models import Task
class TaskDetail(DetailView):
model = Task
context_object_name = 'task'
#...
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe o DetailView
arquivo django.views
. generic.detail
:
from django.views.generic.detail import DetailView
Linguagem de código: Python ( python )
Segundo, defina uma TaskDetail
classe que herde da DetailView
classe. Na TaskDetail
classe, definimos os seguintes atributos:
model
especifica a classe do objeto que será exibido.context_object_name
especifica o nome do objeto no modelo. Por padrão, o Django usaobject
como nome do objeto no modelo. Para tornar isso mais óbvio, usamos thetask
como nome do objeto.
Por padrão, a TaskDetail
classe carregará o template com o nome task_detail.html
da templates/todo
aplicação.
Se quiser usar um nome de modelo diferente, você pode usar o template_name
atributo na TaskDetail
classe.
Crie o modelo task_detail.html
Crie o task_detail.html
modelo no templates/blog
diretório com o seguinte código:
{%extends 'base.html'%}
{%block content%}
<article class="task">
<header>
<h2>{{ task.title }}</h2>
<span class="badge {% if task.completed %}badge-completed{% else %}badge-pending{%endif%}">
{% if task.completed %} Completed {%else%} Pending {%endif%}
</span>
</header>
<p>{{task.description}}</p>
</article>
{%endblock content%}
Linguagem de código: HTML, XML ( xml )
O task_detail.html
modelo estende base.html
o modelo.
O task_detail.html
modelo usa task
como objeto e exibe os atributos da tarefa, incluindo título, status (concluído ou não) e descrição.
Definindo uma rota
Defina uma rota que mapeie a URL que exibe uma tarefa com o resultado do as_view()
método da TaskDetail
classe:
from django.urls import path
from .views import home, TaskList, TaskDetail
urlpatterns = [
path('', home, name='home'),
path('tasks/', TaskList.as_view(),name='tasks'),
path('task/<int:pk>/',TaskDetail.as_view(),name='task'),
]
Linguagem de código: Python ( python )
A URL aceita um número inteiro como o id (ou chave primária, pk) da tarefa. O TaskDetail pegará esse pk
parâmetro, selecionará a tarefa do banco de dados pelo id, construirá um objeto Task e o passará para um modelo.
Modificando o modelo task_list.html
Modifique o task_list.html
modelo para incluir o link para cada tarefa na lista de tarefas usando a url
tag:
{%extends 'base.html'%}
{%block content%}
<div class="center">
<h2>My Todo List</h2>
{% if tasks %}
<ul class="tasks">
{% for task in tasks %}
<li><a href="{% url 'task' task.id %}" class="{% if task.completed%}completed{%endif%}">{{ task.title }}</a>
<div class="task-controls">
<a href="#"><i class="bi bi-trash"></i> </a>
<a href="#"><i class="bi bi-pencil-square"></i></a>
</div>
</li>
{% endfor %}
{% else %}
<p>🎉 Yay, you have no pending tasks!</p>
{% endif %}
</ul>
</div>
{%endblock content%}
Linguagem de código: HTML, XML ( xml )
Ao clicar no link de cada tag, você será redirecionado para a página de detalhes da tarefa.
Execute o servidor de desenvolvimento Django:
python manage.py runserver
Linguagem de código: texto simples ( texto simples )
e abra a lista de tarefas:
http://127.0.0.1:8000/tasks/
Linguagem de código: texto simples ( texto simples )
você verá a seguinte lista de tarefas:
E clique em uma tarefa, por exemplo, Learn Python
, você será redirecionado para a página de detalhes da tarefa:
Você pode baixar o código final deste tutorial do Django DetailView aqui.
Resumo
- Use Django
DetailView
para exibir os detalhes de um objeto.