Opened 5 years ago

Closed 5 years ago

Last modified 2 years ago

#30577 closed New feature (needsinfo)

feature request: custom rendering for readonly fields in admin

Reported by: David Owned by: nobody
Component: contrib.admin Version: 2.2
Severity: Normal Keywords:
Cc: Florian Demmer, Carlos Palol Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The new view permission is extremely useful, and encourages more use of the Django Admin tool. It has highlighted a limitation in the rendering of readonly_fields that can be easily addressed. At the moment, readonly_fields (or all fields when the user has only can_view) can only have custom rendering or formatting if they are custom properties or new fields (created in the ModelAdmin), existing fields can't be changed. In my use-case I have a number of rich text enhanced TextFields, which when rendered as read-only show up as HTML and can't be marked safe. In this case creating a custom field in the ModelAdmin where the Field can be output with mark_safe() doesn't work as the original field needs to exist for users with change permissions, the only other way is to include the field twice which creates UX issues.

If, in ModelAdmin, you could override the formatting/output of a read-only field it would address this issue. Alternatively, as mentioned in the comments of #14802, the idea of Fields having a method that is called by admin to handle the read-only HTML rendering would also do the trick as is related.

Change History (5)

comment:1 by Carlton Gibson, 5 years ago

Hi David.

This is interesting. I think I see where you're coming from but, could I ask you to put together an minimal project that demonstrates exactly the issue you're seeing — perhaps with some screenshots etc — so we can make sure we're 100% clear?

I'm not sure about an adjustment here. I think it would depend on exactly what's being proposed. Do you have a specific implementation idea?

It may be that there's a work-around.

bf39978a53f117ca02e9a0c78b76664a41a54745 introduced a check on the widget for a read_only attribute, when rendering AdminReadonlyField

if field in self.form.fields:
    widget = self.form[field].field.widget
    # This isn't elegant but suffices for contrib.auth's
    # ReadOnlyPasswordHashWidget.
    if getattr(widget, 'read_only', False):
        return widget.render(field, value)

If you were to override, ModelAdmin.get_form() to set a custom widget (with read_only=True) on the required field, when the user did not have the change permission, you should 🤔 be able to leverage this to get the behaviour you need. (If you could put together that test project it would be easy enough to have a play with this...)

Given these questions, and that #14802 was closed as wontfix, I'm going to close this as needsinfo right now. A sample project plus a proposal is probably needed to progress. With just a sample project, asking on the DevelopersMailingList might provide some help. Exploring the work-around would be the shortest route forward.

Last edited 5 years ago by Carlton Gibson (previous) (diff)

comment:2 by Carlton Gibson, 5 years ago

Resolution: → needsinfo
Status: new → closed

comment:3 by Florian Demmer, 3 years ago

Cc: Florian Demmer added

comment:4 by Filipe, 3 years ago

Just ended up here while looking for a way to have a custom widget on a read-only JSONField and bumping into ReadOnlyPasswordHashWidget hackery on my own...

Wouldn't it be cleaner (and easy) to simple update ​https://github.com/django/django/blob/main/django/contrib/admin/templates/admin/includes/fieldset.html#L16-L18 to check for an existing field.readonly_widget all the time?

As I'm not sure how to use the readonlyhashwidget step (field needs to *not* be readonly and widget then is readonly...?), I've gone the route of simply using custom methods to render the "field" but it's not as reusable as being able to set globally used readonly-widgets per form.Field class...

Last edited 3 years ago by Filipe (previous) (diff)

comment:5 by Carlos Palol, 2 years ago

Cc: Carlos Palol added
Note: See TracTickets for help on using tickets.
Back to Top