Visualização de atualização do Django

Resumo : neste tutorial, você aprenderá como usar a UpdateViewclasse 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 UpdateViewclasse 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 UpdateViewclasse Django, criaremos uma view que edita uma tarefa do Todo App .

Para fazer isso, modificamos o views.pyaplicativo de tarefas e definimos a TaskUpdateclasse que herda da UpdateViewclasse 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 UpdateViewdo django.views.generic.edit:

from django.views.generic.edit import CreateView, UpdateViewLinguagem de código:  Python  ( python )

Segundo, defina a TaskUpdateclasse que herda da UpdateViewclasse. Na TaskUpdateclasse defina os seguintes atributos e métodos:

  • modelespecifica 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.
  • success_urlé a URL de destino (lista de tarefas) para a qual o Django irá redirecionar assim que uma tarefa for atualizada com sucesso.
  • form_valid()– o método é chamado assim que o formulário é postado com sucesso. Neste exemplo, criamos uma mensagem flash e retornamos o resultado do form_valid()método da superclasse.

Por padrão, a TaskUpdateclasse usa o task_form.htmlmodelo do templates/tododiretório. Observe que as classes CreateViewe UpdateViewcompartilham o mesmo nome de modelo.

Se quiser usar um nome de modelo diferente, você pode especificá-lo usando o template_nameatributo.

Criando o modelo task_form.html

Modifique o task_form.htmlmodelo que mostra o Update Tasktítulo se a variável de tarefa estiver disponível no modelo (modo de edição) ou Create Tasknã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.pyapp todo que mapeie uma URL com o resultado do as_view()método da TaskUpdateclasse:

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.htmlmodelo 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 UpdateViewclasse para criar uma visualização baseada em classe que edita um objeto existente.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *