Django Crispy Forms inside Bootstrap Modals
Project description
django-crisp-modals
django-crisp-modals is a Django app which provides support for ajax Django Crispy Forms inside Bootstrap 5 modal dialogs. The app provides various views, form classes, templates and javascript. A demo site showcasing an example configuration various features, is available in the repository.
Quick start
-
Add "crisp_modals", and "crispy_forms" to your INSTALLED_APPS setting like this::
INSTALLED_APPS = [ ..., "crispy_forms", "crispy_bootstrap5", "crisp_modals", ]
-
Add the following to your settings.py file::
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" CRISPY_TEMPLATE_PACK = "bootstrap5"
-
Include the
crisp_modals/modals.min.jswithin your base template after jQuery and add a blank modal div to the bottom of the body tag. The modal div should have the id:modal-target. Then initialize the modal target. For example:{% load static %} ... <div id="modal-target"></div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery-form@4.3.0/dist/jquery.form.min.js"></script> <script src="{% static 'crisp_modals/modals.min.js' %}"></script> <script> $(document).ready(function() { $('#modal-target').initModal(); }); window.setupModal = function(element) { // Add any additional setup code here to be executed for each modal } </script> -
Create forms as follows. The main crispy-forms helper is available as
self.bodywithin the forms. A footer helper is also available asself.footer, with submit and reset buttons already included.from crisp_modals.forms import ModalModelForm, Row, FullWidth class PollForm(ModalModelForm): class Meta: model = Poll fields = ['question', 'pub_date'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if self.instance.pk: self.body.form_action = reverse('polls:poll-update', kwargs={'pk': self.instance.pk}) else: self.body.form_action = reverse('polls:poll-create') self.body.append( Row( FullWidth('question', placeholder='Enter your question'), ), Row( FullWidth('pub_date', placeholder='Enter the publication date'), ) )
-
In your views, use the ModalCreateView, ModalUpdateView, and ModalDeleteView classes as follows. Include
delete_urlin the form kwargs for the ModalUpdateView class to show the delete button within the form.from crisp_modals.views import ModalCreateView, ModalUpdateView, ModalDeleteView class PollCreateView(ModalCreateView): model = Poll form_class = PollForm class PollCreateView(ModalUpdateView): model = Poll form_class = PollForm def get_form_kwargs(self): kwargs = super().get_form_kwargs() kwargs['delete_url'] = reverse('polls:poll-delete', kwargs={'pk': self.object.pk}) return kwargs class PollDeleteView(ModalDeleteView): model = Poll
-
To distinguish regular links from links that target modals, use the 'data-modal-url' attribute instead of href. For example:
<a href="#0" data-modal-url="{% url 'polls:poll-create' %}" class="modal-link">Create Poll</a> <a href="#0" data-modal-url="{% url 'polls:poll-update' pk=poll.pk %}">Update Poll</a>
Note:
The
data-modal-urlattribute should contain the url of the view that will render the modal. It doesn't have to return a form. Non-form modal content can be rendered by overriding themodal_contentblock in the modal templatecrisp_modals/modal.html. The following blocks are available for overriding:modal_header,modal_body,modal_footer,modal_scripts. Themodal_scriptsblock should be used to include any additional javascript required for the modal content.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_crisp_modals-2025.5.5.tar.gz.
File metadata
- Download URL: django_crisp_modals-2025.5.5.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60f404b40f0b77ed5fe96fe79532704e133adf3f508fde4b51bba2ecf5b6c613
|
|
| MD5 |
9ca3e0c7a1768662ec99c275b2a4b356
|
|
| BLAKE2b-256 |
394637bf480b8de38b496ceeaf6bd596f3aa3ec4696ffa2684f0fdfdbabaf779
|
File details
Details for the file django_crisp_modals-2025.5.5-py3-none-any.whl.
File metadata
- Download URL: django_crisp_modals-2025.5.5-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d481ac0ba2a2c63da073cc39ca7e526440be99f2b0f24f9efc682c8b3e1178d
|
|
| MD5 |
081a63441d2a784fb38a3dc14a12901e
|
|
| BLAKE2b-256 |
08c17109b6f3cde4896f6b26b6467290c62e144bd8f8fc6599c1bff621357e97
|