Теперь добавим возможность редактирования и удаления объектов модели. Для этого продолжим работу с проектом из предыдущего шага.
Сначала добавим, в файл представлений views.py, функции-представления, которые будут выполнять редактирование и удаление информации из БД:
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponseNotFound
from .models import Person
# Получение данных из БД
def index(request):
people = Person.objects.all()
return render(request, 'index.html', {'people': people})
# Сохранение данных в БД
def create(request):
if request.method == 'POST':
person = Person()
person.name = request.POST.get('name')
person.age = request.POST.get('age')
person.save()
return HttpResponseRedirect('/')
# Изменение данных в БД
def edit(request, id):
try:
person = Person.objects.get(id=id)
if request.method == 'POST':
person.name = request.POST.get('name')
person.age = request.POST.get('age')
person.save()
return HttpResponseRedirect('/')
else:
return render(request, 'edit.html', {'person': person})
except Person.DoesNotExist:
return HttpResponseNotFound('<h2>Person not found</h2>')
# Удаление данных из БД
def delete(request, id):
try:
person = Person.objects.get(id=id)
person.delete()
return HttpResponseRedirect('/')
except Person.DoesNotExist:
return HttpResponseNotFound('<h2>Person not found</h2>')
Первые две функции-представления: index() и create() - здесь остаются без изменений.
Функция edit() выполняет редактирование объекта. Она, в качестве параметра, принимает идентификатор объекта id из базы данных. В начале, по этому идентификатору, мы пытаемся получить объект из БД, с помощью метода Person.objects.get(id=id).
Поскольку, в случае отсутствия объекта, мы можем столкнуться с исключением DoesNotExist (объект не найден), то нужно обработать это исключение(если по каким-либо причинам мы получим несуществующий идентификатор).
И если объект найден не будет, пользователю вернется сообщение об ошибке 404 - через вызов return HttpResponseNotFound().
Когда объект найден, обработка будет делиться на две ветви:
1. Если поступит запрос POST, т. е. пользователь отправил новые (измененные) данные для объекта, мы сохраняем эти данные в БД и выполняем переадресацию на главную страницу.
2. Если поступит запрос GET, передаём пользователю шаблон edit.html с формой для редактирования объекта.
Функция delete() аналогичным образом находит объект и выполняет его удаление.
Теперь нужно создать шаблон для страницы, на которой пользователь может редактировать данные. Для этого добавим в директорию templates файл edit.html со следующим содержимым:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CRUD - Редактирование</title>
</head>
<body>
<form method="POST">
{% csrf_token %}
<p>
<label>Введите имя</label><br>
<input type="text" name="name" value="{{ person.name }}"/>
</p>
<p>
<label>Введите возраст</label><br>
<input type="number" name="age" value="{{ person.age }}"/>
</p>
<p>
<input type="submit" value="Сохранить">
</p>
</form>
</body>
</html>
Затем, в файле urls.py, сопоставим функции-представления edit() и delete() с маршрутами:
from django.urls import path
from crud import views
urlpatterns = [
path('', views.index),
path('create/', views.create),
path('edit/<int:id>/', views.edit),
path('delete/<int:id>/', views.delete),
]
Запустим проект. Теперь на главной странице рядом с каждым объектом (клиентом) будут работать две ссылки: Изменить и Удалить:
Попробуем изменить данные пользователя с id=1(http://127.0.0.1:8000/edit/1/), изменим его возраст:
Как мы видим, изменение данных пользователей прекрасно работает, и давайте под конец попробуем удалить пользователя с id=5:
В том, что клиент с id=5 действительно удален из БД, можно убедиться, если открыть таблицу crud_person с помощью SQLiteStudio:
В этом разделе мы создали свой первый CRUD-проект. Если у вас возникли трудности, вы можете посмотреть исходный код проекта на GitHub: https://github.com/Permin0ff/Course_CRUD_1.