Динамическое отображение формы при AJAX-запросе с помощью Django
Введение
Мне кажется, я что-то путаю, как (чистый) AJAX и Django должны использоваться, пока я пытаюсь реализовать следующее:
- В представлении отображается список всех объектов модели с кнопками для изменения существующего или создания нового объекта.
- При нажатии на такую кнопку открывается модальная форма и выполняется AJAX-запрос для вывода формы .
- Представление Django обрабатывает запрос и рендерит шаблон для запрашиваемой формы с помощью
render_to_string
Django.
- Рендерированная строка возвращается как контекст с
JsonResponse
от Django
- Возвращенный JSON используется для отображения формы через JavaScript (
modal.innerHTML
) - Форма заполняется пользователем и отправляется с помощью AJAX в представление Django, где данные формы будут обработаны .
- Ответ выдается представлением с помощью
JsonResponse
и показывает успех или ошибки
После реализации шага 5 мне стало интересно, на правильном ли я пути. Использование render_to_string и JsonResponse приводит к появлению некоторого дополнительного пространства перед формой. Это вызвано BOM. Если быть точным, \ufeff
дописывает HTML содержащую строку, в результате чего BOM отображается (но не показывается) браузером и вызывает нежелательную дополнительную строку.
Я не нашел другого решения, кроме как использовать replace
несколько раз в строке HTML, чтобы избежать BOM (и некоторых дополнительных нежелательных символов) и последующей нежелательной дополнительной строки при отображении формы в модале. Это заставило меня задуматься, правильным ли путем я иду.
Вопрос
Как динамически загружаемый HTML (например, формы) должен быть доставлен с помощью Django и (чистого) AJAX, чтобы сделать возможным что-то вроде того, что я хочу?
Мои соображения на данный момент
Я знаю, что AJAX часто используется с Django для получения набора объектов или выполнения простых запросов (например, удаление), где достаточно чистых данных в качестве ответа, которые обрабатываются/рефакторятся шаблоном. Я не нашел много (и здесь на SO в основном без ответов) о запросе рендеринга HTML страницы с помощью AJAX и Django.
Особенно ненужный BOM говорит мне о том, что разработчик Django, возможно, не хочет использовать его моим способом (иначе было бы более приятное решение, чем удалить его с помощью replace
, я думаю).
Я прав? Есть какие-нибудь идеи по решению этой проблемы? Я упустил что-то фундаментальное?
В дополнение: Я пытаюсь решить это абстрактно, чтобы загрузить любую форму динамически в модале, и из-за стандартного шаблона рендеринга форм, который я написал, я действительно пытаюсь избежать введения логики рендеринга в каждый шаблон, который должен быть способен показывать динамически загруженные формы (аспект сопровождаемости).
Я знаю о некоторых побочных эффектах асинхронной загрузки HTML, таких как уже установленные события JavaScript не будут работать, когда они должны влиять на динамически загружаемый контент, и на сегодняшний день, кажется, нет проблем с решением этих вещей. Но я буду рад, если кто-то захочет рассмотреть больше возможных ловушек.
HTMX должен сделать этот трюк. Посмотрите