Обработка повторяющихся модалов Bootstrap в Django
Как люди обрабатывают bootstrap-модалы в Django, которые нужно показывать на нескольких страницах? Есть ли у вас специальный класс для обработки второй формы? Используете ли вы Crispy Forms?
Например, если у меня есть модальная форма Contact Us, которая запускается из навигационной панели на всех страницах приложения, как я должен соответствующим образом обработать информацию этой модальной формы? Я не могу представить себе копирование и вставку одного и того же кода модальной формы и представления на всех страницах. Это явно не DRY. Я предполагаю, что существует способ сделать это, поскольку это распространенная проблема.
Просто вставить все это в свой base.html? А потом распространить это на все остальные шаблоны. Не понимаю вопроса.
Например, если у меня есть модальная форма Contact Us, которая запускается из навигационной панели на всех страницах приложения, как я должен соответствующим образом обработать информацию этой модальной формы? Я не могу представить себе копирование и вставку одного и того же кода модальной формы и представления на всех страницах.
Рассмотрите возможность использования оператора include, чтобы вы могли написать свой модал в собственном шаблоне, а затем "включить" его в страницу, на которой вы хотите его повторно использовать. Вот пример, а вот ссылка на docs:
{% include "app/example-modal.html" %}
Затем вы можете создать обработчик в вашем файле views для анализа любых запросов от модала.
Решение, которое я принял, заключалось в следующем:
- Напишите мой модал в собственном шаблоне, как предложил @ljlozano .
- Поместить форму в модале
- Отправьте форму через контекст с уникальным именем и убедитесь, что все представления, которые используют эту форму, будут иметь это имя в контексте.
- Установите префикс для представления обработки .
- Используйте JavaScript через AJAX для отправки формы на соответствующий URL (URL может быть сохранен в шаблоне) .
Python Форма и представление
class ContactUsForm(forms.Form):
pass
class ContactUsView(FormView, TemplateView):
prefix = "contact_us_form"
class HomeView(FormView, TemplateView):
def get_context_data(self, **kwargs):
context_data = super(HomeView, self).get_context_data(**kwargs)
context_data.update({"contact_us_form": ContactUsForm(prefix="contact_us_form")})
return context_data
Шаблон
{% load widget_tweaks %}
<script type="module" src={% static "contact_us.js" %}></script>
<div class="modal-body">
<form method="post" name="id_contact_us_form" id="id_contact_us_form" data-form-url={% url "contact_us" %}>
<label for="contact_us_form-name">Name</label>
{% render_field contact_us_form.name class+="form-control" placeholder="Your name" %}
{{ contact_us_form.errors.name }}
</form>
</div>