#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.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018f8700654d-0f3e08f7-3f75-400a-b7ec-78b37db2ebc0-000000%40eu-central-1.amazonses.com.

Reply via email to