Как добавить форму обратной связи на Django, HTMx
11.04.2025
15.04.2025
5 минут
37
0
0
0
0
Вступление
В этой статье, я опишу как добавить на ваш Django-сайт форму обратной связи используя HTMx и немного DaisyUI, в качестве UI-библиотеки. Всё будет сделано на примере моего нового сайта (ссылки на который у меня пока нет, ибо он ещё в разработке). Но зато будут картинки ٩(◕‿◕。)۶
Разберёмся с html и шаблонами
Для начала, нужно выбрать место, где будет размещена форма. Это может быть отдельная страница, страница с контактами или же подвал сайта. Конкретно я, размещу его в подвале сайта, ибо так хочу. Вот как он будет выглядеть:

Данная форма загружается у меня при помощи AJAX-запроса, то есть динамически, во время загрузки основной страницы. При помощи HTMx это можно сделать вот так:
Здесь я делаю запрос на сервер(hx-get) по адресу feedback/, во время появления данного элемента в DOM(hx-tigger). Ответ сервера я вставляю в элемент div с id="feedback-form-container". Так же я указал простой индикатор загрузки при помощи атрибута hx-indicator, где указал его id.
После запроса по адресу feedback/, сервер вернёт отрендереный шаблон, feedback-form.html.
Сервер вернёт контекстную переменную, form. Мы можем проитерировать её и получить все поля формы, а так же ошибки при заполнении, если таковые имеются. Плюс, мы отдельно вписываем кнопку отправки формы. И так как, наша цель для замены снипета кода, это сама форма, нужно ещё отдельно указать политику замены, то есть hx-swap=outerHTML.
Вместе с формой вернётся сообщение с сервера о результате отправки формы. Это сообщение я отправляю в другой шаблон. Вот так я их подключаю и передаю:

То как выглядит вернувшаяся форма с ошибками

То как выглядит вернувшаяся форма без ошибок
Шаблон сообщения с сервера(попап, тост), toast-message.html, выглядит вот так:
Чтобы корректно работать, данный шаблон должен принимать две контекстные переменные - сообщение(message) и его статус(status). Что более интересно в этом шаблоне, так это то, как и куда он отправляет запросы.
Смотри, отправка запроса происходит при нажатии на сам попап или через 5 секунд после загрузки(hx-trigger="click, load delay:5s"). Запрос отправляется по адресу api/raw_delete/, в качестве ответа сервер всегда возвращает пустую строку и код ответа 200. Больше о триггерах в HTMx можно узнать здесь. А о кодах ответа тут.
Вот представление на сервере, которое отвечает на GET-запросы по адресу api/raw_delete/:
Не обязательно, конечно, использовать именно GET-запрос, просто он самый простой в разработке. Больше о декораторах на django-представления можно узнать уже здесь.
По итогу, попап удаляется и пользователь снова может отправить запрос.
Создадим специальную форму, FeedbackForm
После того как были написаны шаблоны формы и попапы сообщений с сервера, можно и нужно написать класс формы, которая и определяет какие поля в ней должны присутствовать, какие являются обязательными, а какие нет.
Для того чтобы подстроить поле формы под себя, нужно указать для него специальный виджет. В виджетах можно указать значения любых атрибутов(attrs) и так же указать сообщение с ошибкой(error_messages).
На этом с формой всё. Когда закончим с созданием формы обратной связи, мы всегда сможем добавить или удалить ненужные поля. И нам больше ничего не придётся делать, ибо всё уже будет сделано и предварительно настроено.
Разработаем и подключим класс-представление FeedbackView
Осталось обработать входящую форму и вернуть её. Плюс сообщение о статусе формы. Представление формы получается очень простым, хотя не без нюансов. Вот сразу её код:
Начнём по порядку. Если делать всё по официальной документации, то кроме указания таких членов класса, как template_name и form_class нужно ещё будет указать success_url.
И в некоторых случаях это будет уместно, но не в нашем. По крайней мере я не нашёл редирект необходимым для меня. Поэтому немного подсмотрев в исходный код родительского класса(FormMixin), переопределил метод form_valid и просто вернул форму с сообщением о результате на клиент.
Ну и конечно же, подключим созданный класс-представление, в urls.py:
Заключение
Я понимаю, что форма обратной связи предполагает отправку писем на контактный адрес почты. Хотя это не строго обязательно. Можно например собирать эти письма на отдельную таблицу(Django-модель) в базе данных, а там уже делать с ними что-нибудь(сортировать, удалять, делать рассылку и прочее).
Про то, как можно будет подключить django-сайт к почтовым серверам хостингов я расскажу, как-нибудь отдельно. Ну а пока, имеем один из способов, как можно добавить форму обратной связи на сайт, django-сайт.
И как просто это однако с HTMx, никакого JS кода, только HTML и Python. Приятно однако.
Комментарии
(0)
Отправить
Сейчас тут пусто. Буть первым (o゚v゚)ノ
Другое
Похожие статьи
Использованные термины
- Django шаблон ⟶ Это текстовый документ, который размечен специальным ситнаксисом для вставки кода в него.
- HTML (Гипер текстовый язык разметки) ⟶ Это стандартный язык разметки, используемый для создания веб-страниц. Он описывает структуру и содержание документа с помощью различных элементов и тегов. HTML позволяет интегрировать текст, изображения, ссылки, формы и другие медиа-элементы.
- Вебсайт ⟶ Это совокупность связанных между собой веб-страниц, доступных через интернет и имеющих одно общее доменное имя. Каждый веб-сайт может содержать текстовую информацию, изображения, видео и другие мультимедийные элементы. Веб-сайты могут выполнять различные функции, включая предоставление информации, общение, онлайн-торговлю и множество других взаимодействий.
- jQuery ⟶ Это популярная библиотека JavaScript, которая облегчает работу с HTML-документами, обработку событий, анимацию и взаимодействие с сервером с помощью AJAX. Она была создана в 2006 году и быстро приобрела популярность благодаря своей простоте и удобству.
Релевантные вопросы
- Как извлечь контент из динамических веб-страниц? Динамичный веб-сайт будет часто обновлять данные. Например, в Twitter всегда есть новые сообщения. Чтобы скрапинговать такой веб-сайт, это тот же процесс, что и скрапинг других веб-сайтов, но это позволит скраперу получать доступ к веб-сайту с некоторой частотой, чтобы получать постоянно обновляемые данные.
- Когда email стал широко использоваться В 1971 году Рэй Томлинсон отправил первое почтовое сообщение между двумя компьютерами в сети ARPANET, внедрив ныне знакомый синтаксис адреса с символом '@', обозначающим системный адрес пользователя. Но параллельно ARPANET, другие компании также разрабатывали похожие по функционалу электронные почты.