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

Change List

A change-list lists objects of a model. Its basic structure and most important components are explained below. At the end of the page, you'll find a complete change-list 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-list{% 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 actions.

{% filter force_escape %}
{% templatetag openblock %} block stylesheets {% templatetag closeblock %}
    {% endfilter %}{{ block.super }}{% filter force_escape %}
    {% endfilter %}{{ media.css }}{% filter force_escape %}
{% templatetag openblock %} endblock {% 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 %}
    {% endfilter %}{{ media.js }}{% filter force_escape %}
    {% templatetag openblock %} if cl.formset or action_form {% templatetag closeblock %}
        {% templatetag openblock %} url 'admin:jsi18n' as jsi18nurl {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
    {% templatetag openblock %} if action_form {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
    {% templatetag openblock %} if cl.formset {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

Breadcrumbs

A detailed explanation on how breadcrumbs are built can be found here.

{% filter force_escape %}
{% 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 %}

Content Title

{% filter force_escape %}
{% templatetag openblock %} block content_title {% templatetag closeblock %}
    

{% endfilter %}{{ cl.opts.verbose_name_plural|capfirst }}{% filter force_escape %}

{% templatetag openblock %} endblock {% templatetag closeblock %} {% endfilter %}

Object Tools

A detailed explanation on how object-tools are built can be found here.

{% filter force_escape %}
{% templatetag openblock %} block object-tools {% templatetag closeblock %}
    {% templatetag openblock %} if has_add_permission {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

Content

Within the content block, there are some components which are explained separately. Use the following links: Pagination, Search-Form, Filter, Date-Hierarchy, Tables (Result-List) and Submit-Rows.

{% filter force_escape %}
{% templatetag openblock %} block content {% templatetag closeblock %}

    – Pagination, Searchfield, Filters, Date Hierarchy
    – Result-List
    – Pagination
    – Submit-Row

{% templatetag openblock %} endblock {% templatetag closeblock %}
{% endfilter %}

Content Example

Based on Grappellis change_list.html, the content looks like this:

{% filter force_escape %}
{% templatetag openblock %} block content {% templatetag closeblock %}

    
    {% templatetag openblock %} if cl.search_fields or cl.has_filters or cl.date_hierarchy {% templatetag closeblock %}
        
{% templatetag openblock %} if cl.has_filters or cl.search_fields {% templatetag closeblock %} {% templatetag openblock %} block aside {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block pagination_top {% templatetag closeblock %}
{% templatetag openblock %} pagination cl {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} if cl.date_hierarchy {% templatetag closeblock %} {% templatetag openblock %} block date_hierarchy %}
{% templatetag openblock %} date_hierarchy cl {% templatetag closeblock %}
{% templatetag openblock %} endblock %} {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} csrf_token {% templatetag closeblock %}

Results

{% templatetag openblock %} if is_popup %}{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset.errors {% templatetag closeblock %}

{% templatetag openblock %} blocktrans count cl.formset.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 %}

{% endfilter %}{{ cl.formset.non_form_errors }}{% filter force_escape %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset {% templatetag closeblock %} {% endfilter %}{{ cl.formset.management_form }}{% filter force_escape %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block result_list {% templatetag closeblock %} {% templatetag openblock %} result_list cl {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} if not cl.result_count == 0 {% templatetag closeblock %} {% templatetag openblock %} block pagination_bottom {% templatetag closeblock %}
{% templatetag openblock %} pagination cl {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset or action_form {% templatetag closeblock %}

Submit Options

    {% templatetag openblock %} if action_form {% templatetag closeblock %}
  • {% templatetag openblock %} admin_actions {% templatetag closeblock %}
  • {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset {% templatetag closeblock %}
  • {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% endfilter %}

The complete change–list 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 bodyclass {% templatetag closeblock %}grp-change-list{% templatetag openblock %} endblock {% templatetag closeblock %}

{% templatetag openblock %} block stylesheets {% templatetag closeblock %}
    {% endfilter %}{{ block.super }}{% filter force_escape %}
    {% endfilter %}{{ media.css }}{% filter force_escape %}
{% templatetag openblock %} endblock {% 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 %}
    {% endfilter %}{{ media.js }}{% filter force_escape %}
    {% templatetag openblock %} if cl.formset or action_form {% templatetag closeblock %}
        {% templatetag openblock %} url 'admin:jsi18n' as jsi18nurl {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
    {% templatetag openblock %} if action_form {% templatetag closeblock %}
        
    {% templatetag openblock %} endif {% templatetag closeblock %}
    {% templatetag openblock %} if cl.formset {% 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_title {% templatetag closeblock %}
    

{% endfilter %}{{ cl.opts.verbose_name_plural|capfirst }}{% filter force_escape %}

{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block object-tools {% templatetag closeblock %} {% templatetag openblock %} if has_add_permission {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} block content {% templatetag closeblock %} {% templatetag openblock %} if cl.search_fields or cl.has_filters or cl.date_hierarchy {% templatetag closeblock %}
{% templatetag openblock %} if cl.has_filters or cl.search_fields {% templatetag closeblock %} {% templatetag openblock %} block aside {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block pagination_top {% templatetag closeblock %}
{% templatetag openblock %} pagination cl {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} if cl.date_hierarchy {% templatetag closeblock %} {% templatetag openblock %} block date_hierarchy %}
{% templatetag openblock %} date_hierarchy cl {% templatetag closeblock %}
{% templatetag openblock %} endblock %} {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} csrf_token {% templatetag closeblock %}

Results

{% templatetag openblock %} if is_popup %}{% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset.errors {% templatetag closeblock %}

{% templatetag openblock %} blocktrans count cl.formset.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 %}

{% endfilter %}{{ cl.formset.non_form_errors }}{% filter force_escape %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset {% templatetag closeblock %} {% endfilter %}{{ cl.formset.management_form }}{% filter force_escape %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} block result_list {% templatetag closeblock %} {% templatetag openblock %} result_list cl {% templatetag closeblock %} {% templatetag openblock %} endblock {% templatetag closeblock %}
{% templatetag openblock %} if not cl.result_count == 0 {% templatetag closeblock %} {% templatetag openblock %} block pagination_bottom {% templatetag closeblock %}
{% templatetag openblock %} pagination cl {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %} {% templatetag openblock %} if cl.formset or action_form {% templatetag closeblock %} {% templatetag openblock %} endif {% templatetag closeblock %}
{% templatetag openblock %} endblock {% templatetag closeblock %} {% endfilter %}
{% endblock %}