Overview
Unfold provides enhanced inline admin classes with pagination support and additional customization options.
Base Mixin
BaseInlineMixin
Located in unfold/admin.py:237
Base mixin providing common functionality for all Unfold inline classes.
Attributes
formfield_overrides
dict
default:"FORMFIELD_OVERRIDES_INLINE"
Dictionary of field type to widget mappings for form field overrides.
readonly_preprocess_fields
dict[str, Callable | str]
default:"{}"
Dictionary mapping field names to preprocessing functions for readonly fields.
Field name to use for custom ordering functionality.
Number of inline forms to display per page. Enables pagination when set.
Whether to hide the ordering field from display.
Whether the inline should be collapsible.
Inline Classes
TabularInline
from unfold.admin import TabularInline
class TabularInline(
BaseInlineMixin,
BaseModelAdminMixin,
BaseTabularInline
)
Located in unfold/admin.py:246
Tabular inline with Unfold styling and pagination support.
Attributes
formset
Type
default:"PaginationInlineFormSet"
The formset class used for this inline.
Usage Example
from django.contrib import admin
from unfold.admin import ModelAdmin, TabularInline
from .models import Book, Chapter
class ChapterInline(TabularInline):
model = Chapter
extra = 1
per_page = 10 # Enable pagination
ordering_field = "order"
fields = ["title", "page_count", "order"]
@admin.register(Book)
class BookAdmin(ModelAdmin):
inlines = [ChapterInline]
StackedInline
from unfold.admin import StackedInline
class StackedInline(
BaseInlineMixin,
BaseModelAdminMixin,
BaseStackedInline
)
Located in unfold/admin.py:250
Stacked inline with Unfold styling and pagination support.
Attributes
formset
Type
default:"PaginationInlineFormSet"
The formset class used for this inline.
Usage Example
from django.contrib import admin
from unfold.admin import ModelAdmin, StackedInline
from .models import Author, Biography
class BiographyInline(StackedInline):
model = Biography
extra = 0
collapsible = True
fields = ["birth_date", "birth_place", "bio"]
@admin.register(Author)
class AuthorAdmin(ModelAdmin):
inlines = [BiographyInline]
GenericStackedInline
from unfold.admin import GenericStackedInline
class GenericStackedInline(
BaseInlineMixin,
BaseModelAdminMixin,
BaseGenericStackedInline
)
Located in unfold/admin.py:254
Generic stacked inline for use with generic foreign keys.
Attributes
formset
Type
default:"PaginationGenericInlineFormSet"
The formset class used for this inline.
Usage Example
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from unfold.admin import ModelAdmin, GenericStackedInline
from .models import Article, Comment
class CommentInline(GenericStackedInline):
model = Comment
ct_field = "content_type"
ct_fk_field = "object_id"
extra = 1
per_page = 5
@admin.register(Article)
class ArticleAdmin(ModelAdmin):
inlines = [CommentInline]
GenericTabularInline
from unfold.admin import GenericTabularInline
class GenericTabularInline(
BaseInlineMixin,
BaseModelAdminMixin,
BaseGenericTabularInline
)
Located in unfold/admin.py:260
Generic tabular inline for use with generic foreign keys.
Attributes
formset
Type
default:"PaginationGenericInlineFormSet"
The formset class used for this inline.
Usage Example
from django.contrib import admin
from unfold.admin import ModelAdmin, GenericTabularInline
from .models import Product, Tag
class TagInline(GenericTabularInline):
model = Tag
ct_field = "content_type"
ct_fk_field = "object_id"
extra = 1
fields = ["name", "color"]
@admin.register(Product)
class ProductAdmin(ModelAdmin):
inlines = [TagInline]
All inline classes support pagination through the per_page attribute:
class MyInline(TabularInline):
model = MyModel
per_page = 10 # Show 10 items per page
When per_page is set, the inline will:
- Display a pagination interface
- Only load the specified number of forms at once
- Improve performance for inlines with many related objects
Ordering Support
Use the ordering_field attribute to enable drag-and-drop ordering:
class MyInline(TabularInline):
model = MyModel
ordering_field = "order" # Field that stores the order
hide_ordering_field = True # Hide the order field from display
Readonly Field Preprocessing
Preprocess readonly fields before display:
def format_date(value):
return value.strftime("%B %d, %Y")
class MyInline(TabularInline):
model = MyModel
readonly_fields = ["created_at"]
readonly_preprocess_fields = {
"created_at": format_date,
}