Обработка повторяющихся модалов Bootstrap в Django

Как люди обрабатывают bootstrap-модалы в Django, которые нужно показывать на нескольких страницах? Есть ли у вас специальный класс для обработки второй формы? Используете ли вы Crispy Forms?

Например, если у меня есть модальная форма Contact Us, которая запускается из навигационной панели на всех страницах приложения, как я должен соответствующим образом обработать информацию этой модальной формы? Я не могу представить себе копирование и вставку одного и того же кода модальной формы и представления на всех страницах. Это явно не DRY. Я предполагаю, что существует способ сделать это, поскольку это распространенная проблема.

Просто вставить все это в свой base.html? А потом распространить это на все остальные шаблоны. Не понимаю вопроса.

Например, если у меня есть модальная форма Contact Us, которая запускается из навигационной панели на всех страницах приложения, как я должен соответствующим образом обработать информацию этой модальной формы? Я не могу представить себе копирование и вставку одного и того же кода модальной формы и представления на всех страницах.

Рассмотрите возможность использования оператора include, чтобы вы могли написать свой модал в собственном шаблоне, а затем "включить" его в страницу, на которой вы хотите его повторно использовать. Вот пример, а вот ссылка на docs:

{% include "app/example-modal.html" %}

Затем вы можете создать обработчик в вашем файле views для анализа любых запросов от модала.

Решение, которое я принял, заключалось в следующем:

  1. Напишите мой модал в собственном шаблоне, как предложил @ljlozano
  2. .
  3. Поместить форму в модале
  4. Отправьте форму через контекст с уникальным именем и убедитесь, что все представления, которые используют эту форму, будут иметь это имя в контексте.
  5. Установите префикс для представления обработки
  6. .
  7. Используйте JavaScript через AJAX для отправки формы на соответствующий URL (URL может быть сохранен в шаблоне)
  8. .

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>
Вернуться на верх