Для работы с базой данных в Django существует понятие ORM. Само понятие ORM обозначает возможность преобразования и взаимодействия прикладного языка (в нашем случае Python) и базы данных (обычно это SQL).
В любой реализации ORM есть 4 ключевых понятия, которые складываются в аббревиатуру CRUD:
- Create - создание или добавление данных в БД.
- Read - получение и чтение данных из БД.
- Update - обновление данных в БД.
- Delete - удаление данных из БД.
В этом разделе, мы рассмотрим как создается функциональность CRUD в Django, и создадим простое CRUD-приложение.
Продолжим работу с проектом Course_ThirdProject, но добавим в него модели.
Для этого воспользуемся моделью данных Person, а в файл моделей crud/models.py добавим следующий код:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
Согласно приведенной модели данных, в БД предусмотрено два поля для хранения сведений о клиенте: имя клиента name и возраст клиента age.
Не забываем создать и применить миграции:
python manage.py makemigrations
python manage.py migrate
При выполнении миграции, в базе данных (в файле db.sqliteЗ) будет создана таблица для хранения сведений о клиентах с именем crud_person и тремя полями:
id: идентификатор записиname: имя клиентаage: возраст клиента
В Django, за взаимодействие с БД отвечает представление(view). Так что следующим шагом, в файле представлений 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('/')
Здесь нами были созданы две функции-представления: index() и create().
В функции index() мы получаем все данные в объект people, с помощью метода Person.objects.all(), и затем передаем их в шаблон index.html в виде переменной people.
В функции create() мы получаем данные из запроса методом POST, которые пользователь ввел в форму, затем сохраняем их в БД с помощью метода save().
Далее, через класс временной переадресации HttpResponseRedirect, перенаправляем пользователя по пути '/', т.е. выполняем редирект в корневую директорию сайта. Где он, согласно маршрута, будет обрабатываться функцией index(), которая в свою очередь отобразит данные всех пользователей(в том числе и только что добавленные) на главной странице сайта в шаблоне index.html.
Теперь, в директории templates, изменим шаблон главной страницы index.html, в которой будут отображаться введенные пользователем данные:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CRUD</title>
</head>
<body>
<form method="POST" action="create/">
{% 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>
{% if people.count > 0 %}
<h2>Список пользователей</h2>
<table>
<thead align="center">
<tr>
<th width="10%">Id</th>
<th width="30%">Имя</th>
<th width="10%">Возраст</th>
<th width="50%">Действие</th>
</tr>
</thead>
<tbody align="center">
{% for person in people %}
<tr>
<td>{{ person.id }}</td>
<td>{{ person.name }}</td>
<td>{{ person.age }}</td>
<td><a href="edit/{{ person.id }}">Изменить</a> | <a href="delete/{{ person.id }}">Удалить</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</body>
</html>
И наконец, в файле urls.py, свяжем маршруты с функциями-представлениями:
from django.urls import path
from crud import views
urlpatterns = [
path('', views.index),
path('create/', views.create),
]
Что ж, у нас всё готово, и можно запустить приложение. При первом запуске мы получим страницу, которая будет иметь вид, представленный на рисунке:
Попробуем добавить нескольких клиентов. Когда пользователь введёт данные нескольких клиентов(пользователей), информация о них будет получена из БД и отображена на главной странице:
Если мы теперь, с использованием менеджера SQLiteStudio, откроем содержимое таблицы crud_person, то увидим в ней данные о клиентах, которые мы занесли в БД с помощью созданного нами приложения:
Как можно видеть, мы добились свой цели, т. е. занесли информацию в БД через интерфейс НТМL-страницы. При этом мы использовали два метода: Person.objects.all()(получение информации из БД) и person.save()(запись информации о клиентах в БД).