Opened 10 months ago

Last modified 10 months ago

#26763 assigned New feature

Control rendering of add/change/delete_related admin buttons

Reported by: Chris Clark Owned by: Chris Clark
Component: contrib.admin Version: 1.9
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: yes
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: yes

Description (last modified by Chris Clark)

In certain cases, displaying the add/change/delete icons on related fields in the Django admin is undesirable, but this behavior can't currently be overridden. The proposed change allows configuration of which buttons to display by passing kwargs into formfield_for_db.

https://github.com/django/django/pull/6785

Attachments (2)

Screen Shot 2016-06-15 at 9.42.18 AM.png (4.9 KB) - added by Chris Clark 10 months ago.
Screenshot of feature in question
example.jpg (49.3 KB) - added by Chris Clark 10 months ago.
Example of ambiguous UI

Download all attachments as: .zip

Change History (8)

comment:1 Changed 10 months ago by Chris Clark

Description: modified (diff)
Needs documentation: set
Needs tests: set
Owner: changed from nobody to Chris Clark
Status: newassigned

Changed 10 months ago by Chris Clark

Screenshot of feature in question

comment:2 Changed 10 months ago by Tim Graham

Could you add some specifics about the use case? I'll admit I'm a bit fatigued about adding endless options in the admin to provide infinite customization.

Changed 10 months ago by Chris Clark

Attachment: example.jpg added

Example of ambiguous UI

comment:3 Changed 10 months ago by Chris Clark

For sure (and I hear you!). Essentially, the UI can be *incredibly* confusing in certain circumstances so we need to disable it.

Here's a very concrete example:

I've attached a screen shot from our Django admin site. We're an ecommerce company, and this is a customer's shipment with a "12% off" offer applied to it (the last field in the screenshot).

For various reasons, sometimes we need to remove the "offer" from a shipment. Our support reps get a call from a customer, go to the shipment in the Django admin and are *supposed* to set the drop down to --empty--, and save the shipment, in order to remove the offer.

Instead, a handful of times, reps have clicked the red X in order to 'remove' the offer from the shipment. A totally logical and reasonable thing to do, given the UI. But, of course, that deletes *the entire offer* from *the entire system*. The offer might be applied to hundreds, or thousands of different shipments, and disaster ensues.

The irony here is that, for safety, we have the FK field from Shipment -> Offer set as on_delete=set_null because god forbid deleting an offer also deleted all of the shipments. But set_null has the perverse side effect of actually ENABLING this X button; it's hidden in the presence of on_delete=cascade. Hah! (and there are other, valid, reasons to delete offers, and we would never want to delete shipments, so setting on_delete=cascade is not a solution for us here).

This type of UI confusion around these buttons occurs in a dozen or so spots around our admin interface.

comment:4 Changed 10 months ago by Chris Clark

I think it's also notable that the widget itself is already parameterized for this functionality, it's just that it was not carried through to the wrapper, which almost, if you squint and don't think about it too hard, looks like a bug.

comment:5 Changed 10 months ago by Tim Graham

Triage Stage: UnreviewedAccepted

comment:6 Changed 10 months ago by Tim Graham

Easy pickings: unset
Note: See TracTickets for help on using tickets.
Back to Top