Edit tables¶
iommi edit tables build on top of iommi tables but enable editing of cells too.
A simple example:
EditTable(
auto__model=Album,
page_size=10,
# Turn on the edit feature for the year column
columns__year__field__include=True,
# Turn on the delete row feature
columns__delete=EditColumn.delete(),
)
Orderable edit tables¶
iommi edit tables also support manual ordering. That can be especially useful for editing reverse FKs in nested forms.
The easiest way to make an EditTable orderable is to inherit your model from iommi.models.Orderable:
from iommi.models import Orderable
class FavoriteArtist(Orderable):
user = ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='favorite_artists',
)
artist = ForeignKey(Artist, on_delete=CASCADE, related_name='+')
comment = CharField(max_length=255)
def __str__(self):
return self.artist.name
class UserForm(Form):
class Meta:
auto__model = get_user_model()
auto__include = ['username', 'email']
fields__username__editable = False
class FavoriteArtists(EditTable):
class Meta:
auto__model = FavoriteArtist
auto__include = ['artist__name', 'comment', 'sort_order']
columns__comment__field__include = True
sortable = False
user = get_user_model().objects.get(username='john.doe')
class ParentForm(Form):
user_form = UserForm.edit(auto__instance=user)
favorite_artists = FavoriteArtists(rows=user.favorite_artists.all())
class Meta:
actions__submit__post_handler = save_nested_forms
ParentForm()
If you already have a custom model field for ordering, you can register it as a reorder_handle column:
from iommi import register_edit_column_factory
register_edit_column_factory(YourOrderField, shortcut_name='reorder_handle')
If you just use any django integer field, you can still make your EditTable orderable with:
class MyEditTable(EditTable):
class Meta:
auto__model = Foo
columns__bar = EditColumn.reorder_handle()
sortable = False
We use SortableJS and if you want, you can also pass other options. For example this allows multi-drag:
class MyEditTable(EditTable):
class Meta:
auto__model = Foo
columns__bar = EditColumn.reorder_handle()
reorderable = {
"multiDrag": True, # Enable multi-drag
"selectedClass": 'selected', # The class applied to the selected items
"fallbackTolerance": 3, # So that we can select items on mobile
}
sortable = False
Note: We recommend using sortable=False on orderable EditTables, because it doesn’t really make sense to have both.
And if you sort table by another column, the reorder_handle column gets render_column=False.