Opened 2 years ago

Closed 2 years ago

Last modified 2 years ago

#33868 closed Cleanup/optimization (wontfix)

Admin “delete object(s)” view: improve labels of m2m relations

Reported by: julian@pinabausch.org Owned by: nobody
Component: contrib.admin Version: 4.0
Severity: Normal Keywords: admin, delete view
Cc: julian@pinabausch.org, Adam Johnson Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by julian@pinabausch.org)

When deleting an object that has m2m relations in Django Admin, it shows a nice overview of what’s going to be deleted, including the records from m2m relations. An example screenshot is attached to the ticket.

The labels for the m2m relations are constructed like this:

Photo-person relationship: Photo_depicts object (1)

Photo-person relationship makes perfect sense to me; Photo_depicts object (1) could be improved.

I suggest using the labels of the string representation of the concrete from- and to-objects.

Let me know what you think about it and I will see if I can come up with a patch.

Update:
Here’s a possible fix: https://github.com/django/django/pull/15884
Some remarks:

  • The from and to models should be fetched with select_related before __str__ is called
  • This is not a change to django admin (as planned), but it affects *all* auto-generated m2m models . What are the ceveats?
  • Translations are missing currently
  • I'm happy to provide tests if this goes in the right direction

Background:
Two years ago, I had a discussion on the Django developers mailing list about improving the labels that are used for m2m relations in Django Admin’s delete view. While reviewing old tickets to day, I checked the mailing list again and thought “Why not give it another shot?”.
https://groups.google.com/g/django-developers/c/TxZtZyB3kpc

Attachments (2)

Bildschirmfoto 2022-07-26 um 13.48.32.png (186.4 KB ) - added by julian@pinabausch.org 2 years ago.
Delete view sample – deleting a Photo instance that has a “depcits” relation to four people
Bildschirmfoto 2022-07-26 um 22.28.39.png (145.7 KB ) - added by julian@pinabausch.org 2 years ago.
Sample delete view with improved labels

Download all attachments as: .zip

Change History (9)

by julian@pinabausch.org, 2 years ago

Delete view sample – deleting a Photo instance that has a “depcits” relation to four people

comment:1 by julian@pinabausch.org, 2 years ago

Cc: julian@pinabausch.org added
Description: modified (diff)

comment:2 by julian@pinabausch.org, 2 years ago

Description: modified (diff)

comment:3 by julian@pinabausch.org, 2 years ago

Has patch: set
Needs tests: set

by julian@pinabausch.org, 2 years ago

Sample delete view with improved labels

comment:4 by julian@pinabausch.org, 2 years ago

Description: modified (diff)

comment:5 by Carlton Gibson, 2 years ago

Cc: Adam Johnson added
Triage Stage: UnreviewedAccepted

OK, thanks Julian — let's take this for review, since the discussion with Adam was broadly positive (pending any possible blockers).

comment:6 by julian@pinabausch.org, 2 years ago

Resolution: wontfix
Status: newclosed

Closing this – the improved labels can only be implemented by fetching the “from” and “to” instances from the database, i.e. introducing a performance regression. The current implementation’s labels are created based on the models’ verbose names and the m2m instance’s ID, which is quite performance-friendly.

comment:7 by Mariusz Felisiak, 2 years ago

Triage Stage: AcceptedUnreviewed

Closing as "wonfix" due to backward compatibility concerns and a possible performance regression. Users can always override __str__ in their app, e.g.

class FirstModel(models.Model):
    pass


class SecondModel(models.Model):
    firsts = models.ManyToManyField(FirstModel)


def to_str(self):
    return f"between {self.firstmodel} and {self.secondmodel}"


SecondModel.firsts.through.__str__ = to_str
Note: See TracTickets for help on using tickets.
Back to Top