Обработка форм в Django

Концепция работы с формами
В HTML форма является набором элементов внутри тега <form>...</form>, которые позволяют посетителю выполнять действия:
  • ввод текста
  • выбор параметров
  • Отправка файлов
  • управление другими объектами

Далее отправлять эту информацию обратно на сервер
Форма должна указывать две вещи:

  • URL-адрес, на который должны быть возвращены данные, соответствующие вводу пользователя
  • HTTP-метод, по которому должны быть возвращены данные
GETи POST являются единственными методами HTTP, которые можно использовать при работе с формами.

Форма входа Django возвращается с использованием POST метода. Браузер упаковывает данные формы, кодирует их и отправляет на сервер, а затем получает ответ.

GET объединяет отправленные данные в строку и использует ее для создания URL-адреса. URL-адрес содержит адрес, по которому должны быть отправлены данные, а также ключи и значения данных.
внимание
Любой запрос, который можно использовать для изменения состояния системы — например, запрос, который вносит изменения в базу данных — должен использовать POST. GET следует использовать только для запросов, не влияющих на состояние системы.
Класс Forms
В основе системы компонентов лежит класс Form Django. Он описывает логическую структуру объекта, его поведение и другие параметры.

Form класс описывает форму и определяет, как она работает и выглядит. Поля класса формы сопоставляются с <input> элементами формы HTML.

Поля формы сами по себе являются классами; они управляют данными формы и выполняют проверку при отправке формы
Например DateField и FileField обрабатывают разные типы данных и должны делают с ними разные обработки.

Поле формы представляется пользователю в браузере как «виджет» HTML — часть механизма пользовательского интерфейса. У каждого типа поля есть соответствующий класс виджета по умолчанию , но при необходимости его можно переопределить.

При рендеринге объекта в Django необходимо:

  1. получить его в представлении (данные)
  2. передать его в контекст шаблона
  3. сформировать для него HTML-разметку, используя переменные шаблона
СОздание класса формы
Первый этап создания формы - это описание класса модели в файле forms.py в приложении сайта. Классы форм, которые связаны с моделями приложения наследуются от класса ModelForm. В таком случае поля формы выстраиваются по типу полей, указанных в модели в файле models.py. Вам достаточно указать с какой моделью связанна форма, отображаемые поля на форме и вспомогательное описание (например help_text).

Также, если Вам необходимо поменять отображение и поведение полей в форме используется дополнительный параметр widgets
Форма для редактирования или создания Поста
from django.forms import ModelForm

from .models import Post


class PostForm(ModelForm):
    class Meta:
        model = Post
        fields = ('text', 'group', 'image')
        help_text = {'text': 'Текст поста',
                     'group': 'Группа',
                     'image': 'Изображение'}
ОПИСАНИЕ кода
В переменной model указывается модель, по которой строится форма. В кортеже fields указываются поля для отображения в форме. В словаре help_text заносится описание полей.
Построение форм не по модели
from django import forms
 
class PostForm(forms.Form):
    title = forms.CharField()
    description = forms.CharField()
ОПИСАНИЕ кода
В классе указываются необходимые поля, которые являются объектами класса forms. Чтобы обработать форму, нужно создать ее экземпляр в отображении views для URL-адреса. Там же можно создать логику обработки формы.
Пример обработки формы во views
from .forms import PostForm

def post_edit(request, post_id):
    template = 'posts/create_post.html'
    post = get_object_or_404(Post, id=post_id)
    if request.method == 'POST':
        form = PostForm(request.POST or None)
        if form.is_valid():
            post.save()
            return redirect('posts:post_detail', post_id=post.id)
    form = PostForm(request.POST or None)
    context = {'post': post, 'form': form}
    return render(request, template, context)
ОПИСАНИЕ кода
Первый раз страница придет с GET-запросом, он создаст пустой экземпляр формы и поместит его в контекст шаблона для отображения.

При отправки формы POST-запросом, представление снова создаст экземпляр формы и заполнит его данными из запроса: это называется «привязка данных к форме» form = PostForm(request.POST or None)

Вызывается метод формы is_valid(); если он не равен True, возвращаемся к шаблону с формой. В HTML-форме будут заполнены поля, где их можно будет отредактировать по мере необходимости.

Если is_valid()is True, происходит сохранение формы в базу данных. В этом месте также можно обработать данные перед сохранением формы, например автоматически сохранить users, если пользователь авторизован post.author = request.user.

Отображение формы на странице HTML
<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
ОПИСАНИЕ кода
Все поля формы и их атрибуты будут распакованы в HTML-разметку из языка шаблонов Django. {{ form }}

Django поставляется с простой в использовании защитой от подделок межсайтовых запросов. При отправке формы через POSTс включенной защитой CSRF вы должны использовать csrf_token тег шаблона.