Применение модельных форм в CRUD проекте
Рассмотрим пример использования модельных форм в данном проекте. Модельная форма создаётся на основе выбранной модели, что упрощает как создание самой формы, так и последующую обработку данных.
Для начала изменим нашу форму в файле форм forms.py:
from django.forms import ModelForm, CharField, IntegerField
from .models import Person
class PersonForm(ModelForm):
name = CharField(label='Введите имя')
age = IntegerField(label='Введите возраст')
class Meta:
model = Person
fields = ['name', 'age']
Теперь наша форма будет наследоваться от класса ModelForm, в мета-классе формы зададим имя модели model = Person, на основе которой будет создана форма и укажем используемые поля fields = ['name', 'age'].
Затем изменим представления create() и edit() в файле views.py:
from django.shortcuts import render
from django.http import HttpResponseRedirect, HttpResponseNotFound
from .models import Person
from .forms import PersonForm
# Получение данных из БД
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():
form.save()
return HttpResponseRedirect('/')
# Изменение данных в БД
def edit(request, id):
try:
person = Person.objects.get(id=id)
if request.method == 'POST':
form = PersonForm(request.POST, instance=person)
if form.is_valid():
form.save()
return HttpResponseRedirect('/')
else:
form = PersonForm(instance=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>')
Теперь в представлении create() достаточно проверить форму на валидность и если она валидна - сохранить её, воспользовавшись методом save().
В представлении edit() всё точно так-же, только необходимо передать в форму выбранный объект person:
PersonForm(request.POST, instance=person)
Обратите внимание, что без передачи выбранного объекта(instance=person) в форму, будет создана новая запись.
Как мы видим, использование форм Django существенно облегчает работу с HTML-формами, упрощает код представлений и шаблонов, позволяет выполнять валидацию данных, чтобы исключить попадание в БД некорректных данных.
Если у вас возникли трудности, вы можете посмотреть исходный код проекта на GitHub: https://github.com/Permin0ff/Course_CRUD_3.