The inline rows are reordered based on the sortable field (with a templatetag formsetsort). When submitting a form, the values of the sortable field are reindexed according to the position of each row.
In case of errors (somewhere within the form), the position of inline rows is preserved. This also applies to rows prepared for deletion while empty rows are being moved to the end of the formset.

Besides using the drag/drop-handler, you are also able to manually update the position values. This is especially useful with lots of inlines. Just change the number within the position field and the row is automatically moved to the new position. Each row is being reindexed with submitting the form.

There is also GrappelliSortableHiddenMixin, which is a helper Mixin in order to hide the PositionField:

fromgrappelli.formsimportGrappelliSortableHiddenMixinclassMyInlineModelOptions(GrappelliSortableHiddenMixin,admin.TabularInline):fields=(...,"position",)# defining the sortable is only necessary if the sortable field name# is not 'position'sortable_field_name="customposition"

There is also GrappelliSortableHiddenMixin, which is a helper Mixin in order to hide the PositionField:

fromgrappelli.formsimportGrappelliSortableHiddenMixinclassMyInlineModelOptions(GrappelliSortableHiddenMixin,admin.TabularInline):fields=(...,"position",)# defining the sortable is only necessary if the sortable field name# is not 'position'sortable_field_name="customposition"

Sometimes it might make sense to not show inlines at the bottom of the page/form, but somewhere in–between. In order to achieve this, you need to define a placeholder with your fields/fieldsets in admin.py:

If the human-readable value of a field you are searching on is too large to be indexed (e.g. long text as SHA key) or is saved in a different format (e.g. date as integer timestamp), add a staticmethod autocomplete_term_adjust to the corresponding model with the appropriate transformation and perform the lookup on the indexed field:

Grappelli comes with 2 different change–list templates. The standard template shows filters with a drop–down, the alternative template shows filters on the right hand side of the results (similar to djangos admin interface). To use the alternative template, you need to add change_list_template to your ModelAdmin definition:

Grappelli comes with 2 different change–list filters. The standard filters are selects, the alternative filters are list of options (similar to djangos admin interface). To use the alternative filters, you need to add change_list_filter_template to your ModelAdmin definition:

You sometimes might need to see the admin interface as a different user (e.g. in order to verify if permissions are set correctly or to follow an editors explanation). If you set GRAPPELLI_SWITCH_USER to True, you’ll get additional users with your user dropdown. Moreover, you can easily switch back to the original User.