-
Notifications
You must be signed in to change notification settings - Fork 1
Dynamic Django formsets
License
ionata/django-formset-js
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
django-formset-js ================= A wrapper for a JavaScript formset helper. Installing ---------- Install via pip:: pip install django-formset-js Then add it and its dependancy ``django-jquery-js`` to your ``INSTALLED_APPS``:: INSTALLED_APPS += ( 'django.contrib.staticfiles', 'jquery', 'djangoformsetjs', ) Using ----- Include the JavaScript library ****************************** Both jQuery and this library must be included in your page. The simplest way to do this is to add the scripts as media dependencies on your form:: from djangoformsetjs.utils import formset_media_js class MyForm(forms.Form): class Media(object): js = formset_media_js + ( # Other form media here ) MyFormSet = formset_factory(MyForm) And then include the Media of the form in your template:: {{ formset.media }} Alternatively, simply add the script tags:: <script src="{{ STATIC_URL }}js/jquery.js"></script> <script src="{{ STATIC_URL }}js/jquery.formset.js"></script> Render the formset ****************** So that the library can work with your formset, certain blocks of your formset need to be marked up with ``data-formset-...`` attributes:: {% load formset_tags %} <div id="formset" data-formset-prefix="{{ formset.prefix }}"> {{ formset.management_form }} <div data-formset-body> <!-- New forms will be inserted in here --> {% for form in formset %} <div data-formset-form> {{ form }} <button type="button" data-formset-delete-button>Delete form</button> </div> {% endfor %} </div> <!-- The empty form template. By wrapping this in a <script> tag, the __prefix__ placeholder can easily be replaced in both attributes and any scripts --> <script type="form-template" data-formset-empty-form> {% escapescript %} <div data-formset-form> {{ formset.empty_form }} <button type="button" data-formset-delete-button>Delete form</button> </div> {% endescapescript %} </script> <!-- This button will add a new form when clicked --> <input type="button" value="Add another" data-formset-add> <script>jQuery(function($) { $("#formset").formset({ animateForms: true }); });</script> </div> The ``data-formset-`` data attributes are: ``data-formset-prefix`` The value of ``{{ formset.prefix }}``. This is used to find the management form. ``data-formset-body`` This indicates where all the child forms are. New forms are inserted in here. ``data-formset-form`` Every form (including the empty form) should have this attribute. ``data-formset-empty-form`` The element that contains the empty form template. For best results, use a ``<script>`` tag. ``data-formset-add`` A button that adds a new form. ``data-formset-delete-button`` A button that deletes that form. The empty form template is wrapped in a ``<script>`` as plain text. This stops any JavaScript attached to widgets from running upon page load, and makes finding and replacing the ``__prefix__`` placeholder easier. The contents of the ``<script>`` should be wrapped in a ``{% escapescript %}`` block to prevent any script tags inside from closing the wrapping script tag prematurely. If the forms can be deleted, and contain a delete checkbox, the following actions occur: * When the checkbox is checked, marking the form for deletion, the ``formDeleted`` event is fired on the ``data-formset-form`` container, and the ``data-formset-form-deleted`` attribute is added. * When the checkbox is unchecked, marking the form as active again, the ``formAdded`` event is fired on the ``data-formset-form`` container, and the ``data-formset-form-deleted`` attribute is removed. If the forms can be deleted, and contain a delete button, pressing the delete button will toggle the delete checkbox for that form. The ``DELETE`` field should be hidden if the delete button is used. The delete button is identified by the ``data-formset-delete-button`` attribute:: {% for form in formset %} <div data-formset-form> {{ form.name }} {{ form.age }} <div class="hidden">{{ form.DELETE }}</div> <button type="button" data-formset-delete-button>Delete form</button> </div> {% endfor %} If the ``animateForms`` option is set when the formset is created, adding and deleting forms will be animated by sliding the forms in and out. Options ******* The jQuery plugin takes the following options: ``form``: The selector to find forms. Defaults to ``[data-formset-form]``. ``emptyForm``: The selector to find the empty form template. Defaults to ``script[type=form-template][data-formset-empty-form]``. ``body``: The selector to find the formset body. New forms will be inserted at the bottom of this element. Defaults to ``[data-formset-body]``. ``add``: The selector to find the add button. Defaults to ``[data-formset-add]``. ``deleteButton``: The selector to find the delete button within a form. Defaults to ``[data-formset-delete-button]``. ``hasMaxFormsClass``: The class added to the formset when the maximum number of forms is reached. The maximum number of forms is pulled from the management form. Defaults to ``has-max-forms``. ``animateForms``: Whether to animate form addition/deletion. Defaults to ``false``. Example ------- A minimal example project is provided in the ``example/`` directory. Read ``example/README`` for more information
About
Dynamic Django formsets
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published