Рассмотрим базовые операции с моделями на простейшем примере. создание и вывод объектов модели на примере. Пусть, в файле 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), ]
В итоге получится следующая структура проекта:
Запустим проект и обратимся к приложению в браузере. Вначале добавим несколько объектов через форму на веб-странице. И после каждого добавления мы увидим, как на веб-странице в таблице появляются новые данные:
Нажав на ссылку редактирования, мы перейдем к форме, где мы сможем изменить значения выбранного объекта:
Соответственно нажав на кнопку удаления в таблице объектов, мы удалим выбранный объект.