Применение форм в CRUD проекте
В прошлых шагах мы создавали и обрабатывали формы вручную, теперь возложим эту работу на формы Django, рассмотрим пример использования этих форм в данном проекте.
Сначала создадим файл форм, в директории приложения crud, с именем forms.py, и добавим в него следующий код:
from django.forms import Form, CharField, IntegerField
class PersonForm(Form):
name = CharField(label='Введите имя')
age = IntegerField(label='Введите возраст')
В этом файле мы создали форму PersonForm, с двумя полями name и age, и добавили метки(label) для них.
Затем изменим функции-представления index(), create() и edit() в файле views.py:
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponseNotFound
from .models import Person
from .forms import PersonForm
from django.forms.models import model_to_dict
# Получение данных из БД
def index(request):
form = PersonForm()
people = Person.objects.all()
return render(request, 'index.html', {'form': form, 'people': people})
# Сохранение данных в БД
def create(request):
if request.method == 'POST':
form = PersonForm(request.POST)
if form.is_valid():
person = Person()
person.name = form.cleaned_data['name']
person.age = form.cleaned_data['age']
person.save()
return HttpResponseRedirect('/')
# Изменение данных в БД
def edit(request, id):
try:
person = Person.objects.get(id=id)
if request.method == 'POST':
form = PersonForm(request.POST)
if form.is_valid():
person.name = form.cleaned_data['name']
person.age = form.cleaned_data['age']
person.save()
return HttpResponseRedirect('/')
else:
form = PersonForm(model_to_dict(person))
return render(request, 'edit.html', {'form': form})
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() мы передаём форму PersonForm, в шаблон index.html, в виде переменной form.
В представлении create() мы получаем данные методом POST(словарь request.POST), а затем передаём их в форму PersonForm и проверяем эту форму на валидность. Если форма валидна, то мы можем создать новую запись с "очищенными"(безопасными) данными.
В представлении edit(), при запросе методом POST, мы изменяем значения полей выбранного объекта person полученными данными, если форма прошла валидацию, и сохраняем его.
Если запрос был методом GET, тогда мы передаём в форму выбранный объект person, который преобразуем в словарь, с помощью функции model_to_dict().
В результате этого будет выведена форма, которая будет заполнена данными выбранного объекта.
Затем изменим код шаблона index.html, чтобы в нём выводилась форма в виде таблицы:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CRUD</title>
</head>
<body>
<form method="POST" action="create/">
{% csrf_token %}
<table>
<tbody>
{{ form.as_table }}
<tr>
<td colspan="2" align="center"><input type="submit" value="Сохранить"></td>
</tr>
</tbody>
</table>
</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>
Обратите внимание, что при выводе формы в виде таблицы, необходимо добавить теги таблицы <table> и </table>, форма выводится без них. Если необходимо поместить кнопку отправки данных в эту таблицу, то тогда необходимо создать дополнительную строку в таблице для кнопки.
Точно так-же изменим код и в шаблоне edit.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CRUD - Редактирование</title>
</head>
<body>
<form method="POST">
{% csrf_token %}
<table>
<tbody>
{{ form.as_table }}
<tr>
<td colspan="2" align="center"><input type="submit" value="Сохранить"></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
Проверим результат, запустим сервер:
Теперь форма добавления пользователя выводится в виде таблицы.
Если у вас возникли трудности, вы можете посмотреть исходный код проекта на GitHub: https://github.com/Permin0ff/Course_CRUD_2.