Skip to main content

Django inline formsets with bootstrap

Project description

mizdb-inlines

Django inline formsets with bootstrap for the MIZDB app.

Requires django_bootstrap5.

Formsets will be rendered in a layout with two columns. One column is for the formset form, and the other column is for the delete button of a given formset form.

Installation

Install using pip:

pip install mizdb-inlines

Add to your INSTALLED_APPS in your settings.py:

INSTALLED_APPS = [
    ...,
    "mizdb_inlines",
]

Usage

Add mizdb_inlines/js/mizdb_inlines.js javascript and render the formset using the inline_formset template tag from the mizdb_inlines template tag library:

<!DOCTYPE html>
{% load static mizdb_inlines django_bootstrap5 %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Awesome Form</title>
    {{ combined_media }}
    <script src="{% static 'mizdb_inlines/js/mizdb_inlines.js' %}"></script>
    {% bootstrap_css %}
    {% bootstrap_javascript %}
</head>
<body>
<form class="container mt-3" method="post">
    {% csrf_token %}

    {% bootstrap_form form %}
    {% inline_formset formset layout="horizontal" %}
    {% bootstrap_button button_type="submit" button_class="btn-success" content="Save" %}
    {% bootstrap_button button_type="reset" button_class="btn-warning" content="Reset" %}
</form>
</body>
</html>

The template tag instantiates an InlineFormsetRenderer and returns the renderers render() output. The template tag passes all keyword arguments along to the renderer. The renderer takes an additional keyword argument add_text with which you can set the text of the add button (defaults to the verbose name of the inline formset model). For example, in a template:

{% inline_formset formset layout="horizontal" add_text="Add another delicious Topping" %}

View mixin for inline formsets

Use the InlineFormsetMixin view mixin to remove some of the boilerplate from handling inline formsets. Simply declare the formset classes to use in the formset_classes attribute.

from mizdb_inlines.views import InlineFormsetMixin


class MyView(InlineFormsetMixin, UpdateView):
    model = Pizza
    fields = "__all__"
    template_name = "pizza.html"
    success_url = "/"

    formset_classes = (
        inlineformset_factory(Pizza, Toppings, fields="__all__", extra=1),
        MyAwesomeFormset,
    )

This will add formset instances to the template context with the context variable formsets. The combined media of the formsets and the view's model form is available with the variable combined_media :

{{ combined_media }}

{% for formset in formsets %}
    {% inline_formset formset %}
{% endfor %}

To perform additional actions after the form and formsets have been saved, you can use the post_save hook:

class MyView(InlineFormsetMixin, UpdateView):
    ...
    
    def post_save(self, form, formsets):
        # Log that the form was saved:
        create_logentry(form, formsets)

Tabular inline formset

If you prefer the formset fields to be in a tabular layout, you can use the tabular_inline_formset template tag instead:

{% load mizdb_inlines %}

{% for formset in formsets %}
    {% tabular_inline_formset formset %}
{% endfor %}

Development & Demo

python3 -m venv venv
source venv/bin/activate
make init

See the demo for a preview: run make init-demo and then start the demo server python demo/manage.py runserver.

Run tests with make test. To install required browsers for playwright: playwright install.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mizdb_inlines-0.3.0.tar.gz (13.6 kB view details)

Uploaded Source

Built Distribution

mizdb_inlines-0.3.0-py3-none-any.whl (9.8 kB view details)

Uploaded Python 3

File details

Details for the file mizdb_inlines-0.3.0.tar.gz.

File metadata

  • Download URL: mizdb_inlines-0.3.0.tar.gz
  • Upload date:
  • Size: 13.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for mizdb_inlines-0.3.0.tar.gz
Algorithm Hash digest
SHA256 46887c0ea7974cd4a44507056e357c00a2e1195b5e09a15c5772477688f8f260
MD5 dc6ee1fda29a6db7a542d278c3b164a7
BLAKE2b-256 606a572706e3771e04b916f4a20a3c363f9f7f32897a4684e8fe17ee0cf0a74f

See more details on using hashes here.

File details

Details for the file mizdb_inlines-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mizdb_inlines-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4e26e1fd65b305a74d0e50faf67a0c58d2b86ed1d153528a77ed5bd5e26dbaae
MD5 fc0928eb40a1ff2ece724115210b091a
BLAKE2b-256 e1137b49804c220c0d9e56a8327de40743953a43aff84f7587d5925035038573

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page