Класс Django UpdateView в Python — как использовать

Класс Django UpdateView используется для создания представления на основе класса, которое редактирует существующий объект в Python.

Содержание

Определение класса UpdateView

Класс UpdateView позволяет создать представление на основе класса, которое:

  • Отобразит форму для редактирования существующего объекта.
  • Повторно отобразит форму, если в ней есть ошибки проверки.
  • Сохранит изменения объекта в базе данных.

Форма генерируется автоматически из модели объекта, если вы явно не укажете класс формы.

Чтобы продемонстрировать класс Django UpdateView, мы создадим представление, которое редактирует задачу приложения Todo.

Для этого мы изменяем views.py приложения todo и определяем класс TaskUpdate, который наследуется от класса UpdateView, следующим образом:

# ...
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)

# ...

Как это работает.

  • Сначала импортируйте UpdateView из django.views.generic.edit:
from django.views.generic.edit import CreateView, UpdateView
  • Во-вторых, определите класс TaskUpdate, который наследуется от класса UpdateView. В классе TaskUpdate определите следующие атрибуты и методы:
  1. model указывает класс объекта, который нужно отредактировать. Потому что в этом примере мы указываем Task как модель.
  2. fields — это список, который определяет поля формы. В этом примере мы используем поля title, description и filled.
  3. success_url — целевой URL(список задач), на который Django перенаправит пользователя после успешного обновления задачи.
  4. form_valid() – метод вызывается после успешной отправки формы. В этом примере мы создаем флэш-сообщение и возвращаем результат метода form_valid() суперкласса.

По умолчанию класс TaskUpdate использует шаблон task_form.html из каталога templates/todo. Обратите внимание, что классы CreateView и UpdateView используют одно и то же имя шаблона.

Если вы хотите использовать другое имя шаблона, вы можете указать его с помощью атрибута template_name.

Создание шаблона task_form.html

Измените шаблон task_form.html, который отображает заголовок «Обновить задачу», если переменная задачи доступна в шаблоне (режим редактирования), или «Создать задачу» в противном случае (режим создания).

{%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%}

Определение маршрута

Определите маршрут в urls.py приложения todo, который сопоставляет URL с результатом метода as_view() класса TaskUpdate:

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'),
]

Включая ссылку редактирования

Измените шаблон task_list.html, включив в него ссылку редактирования для каждой задачи в списке задач:

{%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%}

Если вы редактируете задачу из списка дел, добавляя три звездочки(***) к названию и отмечая задачу как выполненную:

Пример редактирования списка задач

Нажмите кнопку «Save», и вы увидите, что название и статус задачи обновились:

Пример обновления названия и статуса задачи

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *