Opened 3 weeks ago

Closed 2 weeks ago

Last modified 2 weeks ago

#37168 closed Bug (fixed)

Readonly fields with db_default display DatabaseDefault representation

Reported by: Mariusz Felisiak Owned by: Mariusz Felisiak
Component: contrib.admin Version: 6.0
Severity: Normal Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Mariusz Felisiak)

Readonly fields with db_default display DatabaseDefault() representation in the admin. For example:

  • models.py
    class MyModel(models.Model):
        uuid = models.UUIDField(db_default=UUID7(), editable=False, primary_key=True)
        created_datetime = models.DateTimeField(db_default=Now(), editable=False)
        modified_datetime = models.DateTimeField(db_default=Now(), editable=False)
        name = models.TextField()
    
  • admin.py
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    readonly_fields = ["uuid", "created_datetime", "modified_datetime"]


I think they should be consider as any other empty values.

Attachments (2)

Screenshot_20260613_125111.png (41.8 KB ) - added by Mariusz Felisiak 3 weeks ago.
ticket_37168.zip (7.4 KB ) - added by Mariusz Felisiak 3 weeks ago.

Download all attachments as: .zip

Change History (15)

by Mariusz Felisiak, 3 weeks ago

comment:1 by Mariusz Felisiak, 3 weeks ago

Description: modified (diff)

comment:2 by Mariusz Felisiak, 3 weeks ago

We wanted to add DatabaseDefault() to the list of Field.empty_values and modify its __hash__ and __eq__. Unfortunately, expression is required to initialize DatabaseDefault and, TBH, DatabaseDefaults with different expression should not be consider equal. I'm thinking about adding is_value_empty() hook to the models.Field:

def is_value_empty(self, value):
    return value in self.empty_values or isinstance(value, DatabaseDefault):

and reusing it everywhere we currently check if value in self.empty_values.

Last edited 3 weeks ago by Mariusz Felisiak (previous) (diff)

by Mariusz Felisiak, 3 weeks ago

Attachment: ticket_37168.zip added

comment:3 by Jacob Walls, 3 weeks ago

Triage Stage: UnreviewedAccepted

Thanks for the report. The hook does sound better than a misleading __eq__()!

comment:4 by Mariusz Felisiak, 3 weeks ago

Has patch: set

comment:5 by Jacob Walls, 2 weeks ago

Needs tests: set
Patch needs improvement: set

comment:6 by Mariusz Felisiak, 2 weeks ago

Patch needs improvement: unset

comment:7 by Mariusz Felisiak, 2 weeks ago

Needs tests: unset

comment:8 by Jacob Walls, 2 weeks ago

Triage Stage: AcceptedReady for checkin

comment:9 by Jacob Walls, 2 weeks ago

Component: Formscontrib.admin
Patch needs improvement: set
Triage Stage: Ready for checkinAccepted

After review, I think adjusting the admin hooks only is safest.

comment:10 by Mariusz Felisiak, 2 weeks ago

Patch needs improvement: unset

comment:11 by Jacob Walls, 2 weeks ago

Triage Stage: AcceptedReady for checkin

comment:12 by GitHub <noreply@…>, 2 weeks ago

Resolution: fixed
Status: assignedclosed

In 77d0c9d:

Fixed #37168 -- Made admin display database defaults as empty values.

comment:13 by Mariusz Felisiak <felisiak.mariusz@…>, 2 weeks ago

In a5405b87:

[6.1.x] Fixed #37168 -- Made admin display database defaults as empty values.

Backport of 77d0c9d549a8d95156c833eceb6275d9b7317d4e from main

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