#35464: Fieldsets defined for TabularInlines are ignored
------------------------------------------------+------------------------
Reporter: Natalia Bidart | Owner: nobody
Type: Cleanup/optimization | Status: new
Component: contrib.admin | Version: dev
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
------------------------------------------------+------------------------
Following the review of the PR solving #35189 and the analysis done in
#35456, I found out that when defining an admin model with a
`TabularInline` instance which defines `fieldsets`, those `fieldsets` are
"ignored" in the UI (in terms of actually using a fieldset element, the
content is shown).
Furthermore, if the `fieldsets` include the `collapse` CSS class, nothing
changes in the UI and there is not way of having collapsible fieldsets
inside `TabularInline`s. See attached screenshots and some example models
down below.
Regarding how to fix this, I see two options:
1. Discuss with the accessibility plan whether there is a way to structure
HTML to have "collapsible fieldsets" inside a tabular context, or
2. Explicitly document that `fieldsets` make no sense for `TabularInline`.
The current docs imply this setup is valid:
> InlineModelAdmin.classes
> A list or tuple containing extra CSS classes to apply to the fieldset
that is rendered for the inlines. Defaults to None. As with classes
configured in fieldsets, inlines with a collapse class will be initially
collapsed and their header will have a small “show” link.
Example modes and admin models:
* models.py
{{{#!python
from django.db import models
from django.utils.timezone import now
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
publisher = models.CharField(max_length=100)
creation_date = models.DateField(default=now)
update_date = models.DateField(default=now)
publication_date = models.DateField(default=now)
def __str__(self):
return self.title
class Cover(models.Model):
book = models.ForeignKey(Book, on_delete=models.CASCADE)
image = models.CharField(max_length=100)
title = models.CharField(max_length=100)
description = models.TextField()
creation_date = models.DateField(default=now)
update_date = models.DateField(default=now)
updated_by = models.CharField(max_length=100)
}}}
* admin.py
{{{#!python
from django.db import models
from django.contrib import admin
from .models import Book, Cover
class CoverInlineMixin:
model = Cover
extra = 2
fieldsets = (
(None, {"fields": ("image", "title")}),
("Details", {
"fields": ("description", "creation_date"),
"classes": ("collapse",),
}),
("Details", {
"fields": ("update_date", "updated_by"),
"classes": ("collapse",),
}),
)
class CoverTabularInline(CoverInlineMixin, admin.TabularInline):
pass
class CoverStackedInline(CoverInlineMixin, admin.StackedInline):
pass
class BookAdmin(admin.ModelAdmin):
list_display = ("title", "author", "publisher","publication_date")
search_fields = ("title", "author")
list_filter = ("author", "publication_date")
fieldsets = (
(None, {
"fields": ("title", "author")
}),
("Advanced options", {
"classes": ("collapse",),
"fields": ("publisher", "publication_date",)
}),
("Advanced options", {
"classes": ("collapse",),
"fields": ("creation_date", "update_date",)
}),
)
inlines = [
CoverTabularInline,
CoverStackedInline,
]
admin.site.register(Book, BookAdmin)
}}}
--
Ticket URL: <
https://code.djangoproject.com/ticket/35464>
Django <
https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.