Django 5 для начинающих

Прогресс по курсу:  9/1004

4.2 CRUD проект
4 из 12 шагов пройдено
0 из 60 баллов  получено

Применение форм в 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.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.