﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
35464	Fieldsets defined for TabularInlines are ignored	Natalia Bidart	Maryam Yusuf	"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)
}}}"	Cleanup/optimization	closed	contrib.admin	dev	Normal	fixed		Marijke Luttekes Thibaud Colas Tom Carrick Sarah Abderemane Ryan Cheley	Ready for checkin	1	0	0	0	0	1
