Resumo : neste tutorial, você aprenderá como usar a UpdateView
classe Django para criar uma visualização baseada em classe que edita um objeto existente.
Este tutorial começa onde o tutorial Django CreateView parou.
Definindo a classe UpdateView
A UpdateView
classe permite criar uma visão baseada em classe que:
- Exiba um formulário para editar um objeto existente.
- Exiba novamente o formulário se houver erros de validação.
- Salve as alterações do objeto no banco de dados.
O formulário é gerado automaticamente a partir do modelo do objeto , a menos que você especifique explicitamente uma classe de formulário .
Para demonstrar a UpdateView
classe Django, criaremos uma view que edita uma tarefa do Todo App .
Para fazer isso, modificamos o views.py
aplicativo de tarefas e definimos a TaskUpdate
classe que herda da UpdateView
classe assim:
# ...
from django.views.generic.edit import CreateView, UpdateView
from django.contrib import messages
from django.urls import reverse_lazy
from .models import Task
class TaskUpdate(UpdateView):
model = Task
fields = ['title','description','completed']
success_url = reverse_lazy('tasks')
def form_valid(self, form):
messages.success(self.request, "The task was updated successfully.")
return super(TaskUpdate,self).form_valid(form)
# ...
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe UpdateView
do django.views.generic.edit
:
from django.views.generic.edit import CreateView, UpdateView
Linguagem de código: Python ( python )
Segundo, defina a
classe que herda da TaskUpdate
UpdateView
classe. Na
classe defina os seguintes atributos e métodos:TaskUpdate
model
especifica a classe do objeto a ser editado. Porque especificamos Task como modelo neste exemplo.fields
é uma lista que especifica os campos do formulário. Neste exemplo, usamos título, descrição e campos preenchidos.
é a URL de destino (lista de tarefas) para a qual o Django irá redirecionar assim que uma tarefa for atualizada com sucesso.success_url
form_valid()
– o método é chamado assim que o formulário é postado com sucesso. Neste exemplo, criamos uma mensagem flash e retornamos o resultado doform_valid()
método da superclasse.
Por padrão, a TaskUpdate
classe usa o task_form.html
modelo do templates/todo
diretório. Observe que as classes CreateView
e UpdateView
compartilham o mesmo nome de modelo.
Se quiser usar um nome de modelo diferente, você pode especificá-lo usando o template_name
atributo.
Criando o modelo task_form.html
Modifique o task_form.html
modelo que mostra o Update Task
título se a variável de tarefa estiver disponível no modelo (modo de edição) ou Create Task
não (modo de criação).
{%extends 'base.html'%}
{%block content%}
<div class="center">
<form method="post" novalidate class="card">
{%csrf_token %}
<h2>{% if task %} Update {%else %} Create {%endif%} Task</h2>
{% for field in form %}
{% if field.name == 'completed' %}
<p>
{{ field.label_tag }}
{{ field }}
</p>
{% if field.errors %}
<small class="error">{{ field.errors|striptags }}</small>
{% endif %}
{% else %}
{{ field.label_tag }}
{{ field }}
{% if field.errors %}
<small class="error">{{ field.errors|striptags }}</small>
{% endif %}
{% endif %}
{% endfor %}
<div class="form-buttons">
<input type="submit" value="Save" class="btn btn-primary"/>
<a href="{%url 'tasks'%}" class="btn btn-outline">Cancel</a>
</div>
</form>
</div>
{%endblock content%}
Linguagem de código: HTML, XML ( xml )
Definindo uma rota
Defina uma rota no urls.py
app todo que mapeie uma URL com o resultado do as_view()
método da TaskUpdate
classe:
from django.urls import path
from .views import (
home,
TaskList,
TaskDetail,
TaskCreate,
TaskUpdate
)
urlpatterns = [
path('', home, name='home'),
path('tasks/', TaskList.as_view(),name='tasks'),
path('task/<int:pk>/', TaskDetail.as_view(),name='task'),
path('task/create/', TaskCreate.as_view(),name='task-create'),
path('task/update/<int:pk>/', TaskUpdate.as_view(),name='task-update'),
]
Linguagem de código: Python ( python )
Incluindo um link de edição
Modifique o task_list.html
modelo para incluir o link de edição para cada tarefa na lista de tarefas:
{%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="{%url 'task-update' task.id %}"><i class="bi bi-pencil-square"></i></a>
</div>
</li>
{% endfor %}
{% else %}
<p>🎉 Yay, you have no pending tasks! <a href="{%url 'task-create'%}">Create Task</a></p>
{% endif %}
</ul>
</div>
{%endblock content%}
Linguagem de código: HTML, XML ( xml )
Se você editar uma tarefa da lista de tarefas anexando três asteriscos ( ***
) ao título e marcando a tarefa como concluída:
Clique no botão Salvar e você verá que o título e o status da tarefa são atualizados:
Você pode baixar o código final deste tutorial do Django UpdateView aqui.
Resumo
- Defina uma nova classe que herda da
UpdateView
classe para criar uma visualização baseada em classe que edita um objeto existente.