{% extends "admin/base_site.html" %} {% load i18n %} {% block bodyclass %}grp-doc{% endblock %} {% block content-class %}{% endblock %} {% block title %}Grappelli Documentation » Change-Form{% endblock %} {% block extrahead %} {% endblock %} {% block breadcrumbs %} {% endblock %} {% block content %}

Change-Form

A change-form is used for adding/editing the data of an object. Its basic structure and most important components are explained below. At the end of the page, you'll find a complete change-form template. Make sure to read about how a custom template is built first to gain basic understanding.

Extend the Base, Load Stuff You Need, Define the Body-Class

{% filter force_escape %}
{% templatetag openblock %} extends "admin/base_site.html" {% templatetag closeblock %}
{% templatetag openblock %} load i18n static admin_modify grp_tags {% templatetag closeblock %}
{% templatetag openblock %} block bodyclass {% templatetag closeblock %}grp-change-form{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

Custom Stylesheets, Javascripts

Link custom stylesheets if needed. Regarding javascripts, you should take a look at Grappellis change_list.html — mentioned below are just the parts you need for the page-tools and collapsibles.

{% filter force_escape %}
{% templatetag openblock %} block extrastyle {% templatetag closeblock %}
    
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} block javascripts {% templatetag closeblock %}
    {% endfilter %}{{ block.super }}{% filter force_escape %}
    {% templatetag openblock %} url 'admin:jsi18n' as jsi18nurl {% templatetag closeblock %}
    
    
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

Page-Tools & Breadcrumbs

A detailed explanation on how breadcrumbs & page-tools are built can be found here.

{% filter force_escape %}
{% templatetag openblock %} block page-tools {% templatetag closeblock %}
    {% templatetag openblock %} if not is_popup {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block breadcrumbs {% templatetag closeblock %}
    {% templatetag openblock %} if not is_popup {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

The Actual Content

A detailed explanation on how the different components of the content are built can be found using the following links: Modules, Rows & Cells, Collapsible Modules, Stacked & Tabular Groups, Collapsible Groups, Labels, Form Fields & Widths, Fieldsets and Submit Rows.

{% filter force_escape %}
{% templatetag openblock %} block content {% templatetag closeblock %}
    
{% templatetag openblock %} csrf_token {% templatetag closeblock %} {% templatetag openblock %} block form_top {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} if is_popup {% templatetag closeblock %}{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if errors {% templatetag closeblock %}

{% templatetag openblock %} blocktrans count errors|length as counter {% templatetag closeblock %} Please correct the error below. {% templatetag openblock %} plural {% templatetag closeblock %} Please correct the errors below. {% templatetag openblock %} endblocktrans {% templatetag closeblock %}

    {% templatetag openblock %} for error in adminform.form.non_field_errors %}
  • {% endfilter %}{{ error }}{% filter force_escape %}
  • {% templatetag openblock %} endfor {% templatetag closeblock %}
{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block field_sets {% templatetag closeblock %} {% templatetag openblock %} for fieldset in adminform {% templatetag closeblock %} {% templatetag openblock %} include "admin/includes/fieldset.html" {% templatetag closeblock %} {% templatetag openblock %} endfor {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block after_field_sets {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block inline_field_sets {% templatetag closeblock %} {% templatetag openblock %} for inline_admin_formset in inline_admin_formsets {% templatetag closeblock %} {% templatetag openblock %} include inline_admin_formset.opts.template {% templatetag closeblock %} {% templatetag openblock %} endfor {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block after_related_objects {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block submit_buttons_bottom {% templatetag closeblock %}{% templatetag openblock %} submit_row {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} if adminform and add {% templatetag closeblock %} {% templatetag openblock %} block extrahead {% templatetag closeblock %} {% endfilter %}{{ block.super }}{% filter force_escape %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} prepopulated_fields_js {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% endfilter %}

The complete change–form template

{% filter force_escape %}
{% templatetag openblock %} extends "admin/base_site.html" {% templatetag closeblock %}
{% templatetag openblock %} load i18n static admin_modify grp_tags {% templatetag closeblock %}

{% templatetag openblock %} block extrastyle {% templatetag closeblock %}
    
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} block javascripts {% templatetag closeblock %}
    {% endfilter %}{{ block.super }}{% filter force_escape %}
    {% templatetag openblock %} url 'admin:jsi18n' as jsi18nurl {% templatetag closeblock %}
    
    
{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block bodyclass {% templatetag closeblock %}grp-change-form{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block page-tools {% templatetag closeblock %}
    {% templatetag openblock %} if not is_popup {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block breadcrumbs {% templatetag closeblock %}
    {% templatetag openblock %} if not is_popup {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block content {% templatetag closeblock %}
    
{% templatetag openblock %} csrf_token {% templatetag closeblock %} {% templatetag openblock %} block form_top {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} if is_popup {% templatetag closeblock %}{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if errors {% templatetag closeblock %}

{% templatetag openblock %} blocktrans count errors|length as counter {% templatetag closeblock %} Please correct the error below. {% templatetag openblock %} plural {% templatetag closeblock %} Please correct the errors below. {% templatetag openblock %} endblocktrans {% templatetag closeblock %}

    {% templatetag openblock %} for error in adminform.form.non_field_errors %}
  • {% endfilter %}{{ error }}{% filter force_escape %}
  • {% templatetag openblock %} endfor {% templatetag closeblock %}
{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block field_sets {% templatetag closeblock %} {% templatetag openblock %} for fieldset in adminform {% templatetag closeblock %} {% templatetag openblock %} include "admin/includes/fieldset.html" {% templatetag closeblock %} {% templatetag openblock %} endfor {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block after_field_sets {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block inline_field_sets {% templatetag closeblock %} {% templatetag openblock %} for inline_admin_formset in inline_admin_formsets {% templatetag closeblock %} {% templatetag openblock %} include inline_admin_formset.opts.template {% templatetag closeblock %} {% templatetag openblock %} endfor {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block after_related_objects {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block submit_buttons_bottom {% templatetag closeblock %}{% templatetag openblock %} submit_row {% templatetag closeblock %}{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} if adminform and add {% templatetag closeblock %} {% templatetag openblock %} block extrahead {% templatetag closeblock %} {% endfilter %}{{ block.super }}{% filter force_escape %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} prepopulated_fields_js {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% endfilter %}
{% endblock %}