CRUD. Все базовые операции с моделями в веб-приложении

Последнее обновление: 26.08.2022

Рассмотрим базовые операции с моделями на простейшем примере. создание и вывод объектов модели на примере. Пусть, в файле models.py определена модель Person:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()

Определение представлений

В файле 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() получаем все данные с помощью метода Person.objects.all() и передаем их в шаблон index.html.

В функции create() получаем данные из запроса типа POST, сохраняем данные с помощью метода save() и выполняем переадресацию на корень веб-сайта (то есть на функцию index).

Функция edit выполняет редактирование объекта. Функция в качестве параметра принимает идентификатор объекта в базе данных. И вначале по этому идентификатору мы пытаемся найти объект с помощью метода Person.objects.get(id=id). Поскольку в случае отсутствия объекта мы можем столкнуться с исключением Person.DoesNotExist, то соответственно нам надо обработать подобное исключение, если вдруг будет передан несуществующий идентификатор. И если объект не будет найден, то пользователю возващается ошибка 404 через вызов return HttpResponseNotFound().

Если объект найден, то обработка делится на две ветви. Если запрос POST, то есть если пользователь отправил новые изменненые данные для объекта, то сохраняем эти данные в бд и выполняем переадресацию на корень веб-сайта. Если запрос GET, то отображаем пользователю страницу edit.html с формой для редактирования объекта.

Функция delete аналогичным образом находит объет и выполняет его удаление.

Определение шаблонов

В папке templates определим шаблон index.html, который будет выводить данные на веб-страницу:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <form method="POST" action="create/">
        {% csrf_token %}
        <p>
            <label>Введите имя</label><br>
            <input type="text" name="name" />
        </p>
        <p>
            <label>Введите возраст</label><br>
            <input type="number" name="age" />
        </p>
        <input type="submit" value="Сохранить" >
    </form>
    {% if people.count > 0 %}
    <h2>Список пользователей</h2>
    <table>
        <thead><th>Id</th><th>Имя</th><th>Возраст</th><th></th></thead>
        {% 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 %}
    </table>
    {% endif %}
</body>
</html>

В начале шаблона определена форма для добавления данных, которые потом будет получать функция create в POST-запросе. А ниже определена таблица, в которую выводятся данные из переданного из представления набора people. В каждой строке определены ссылки на редактирование и удаление объекта.

Теперь добавим в папку templates файл edit.html со следующим содержимым:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</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>
        <input type="submit" value="Сохранить" >
    </form>
</body>
</html>

Здесь определена форма для редактирования объекта. По нажатию на кнопку введенные на форму данные будут уходить по тому же адресу в запросе POST.

Установка маршрутов

И также в файле urls.py проекта свяжем маршруты с представлениями:

from django.urls import path
from hello import views

urlpatterns = [
    path("", views.index),
    path("create/", views.create),
    path("edit/<int:id>/", views.edit),
    path("delete/<int:id>/", views.delete),
]

В итоге получится следующая структура проекта:

CRUD в Django

Запустим проект и обратимся к приложению в браузере. Вначале добавим несколько объектов через форму на веб-странице. И после каждого добавления мы увидим, как на веб-странице в таблице появляются новые данные:

Добавление и вывод моделей из базы данных на веб-страницу в Django

Нажав на ссылку редактирования, мы перейдем к форме, где мы сможем изменить значения выбранного объекта:

Изменение и удаление в базе данных в Django

Соответственно нажав на кнопку удаления в таблице объектов, мы удалим выбранный объект.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850