Opened 3 weeks ago

Last modified 10 days ago

#36930 assigned Bug

Using a custom ModelChoices (not IntegerChoices or TextChoices) member as the default value of a model field doesn't select the default value in form's select

Reported by: Antoine Humbert Owned by: Antoine Humbert
Component: Database layer (models, ORM) Version: 6.0
Severity: Normal Keywords: enum
Cc: Nick Pope Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description (last modified by Antoine Humbert)

This was triggered in the following forum post: https://forum.djangoproject.com/t/default-for-choices-field-isnt-default-in-admin-form/44189

As per the documentation and the date / DateField example (see https://docs.djangoproject.com/en/6.0/ref/models/fields/#enumeration-types), defining choices for a data type other than int or str (e.g. float) should be :

class FactorChoices(float, models.Choices):
    HALF = 0.5
    SINGLE = 1
    DOUBLE = 2

then, setting a default value for a field should use one of the enumeration's member (as per the example from documentation: default=YearInSchool.FRESHMAN). E.g.:

class SomeModel(models.Model):
    factor = models.FloatField(choices=FactorChoices, default=FactorChoices.SINGLE)

When using such definitions, the default value is not selected by default in forms created for such model. This is bescause the str() of the default value returns the string representation provided by enum.Enum instead of the string representation from float.

I believe this is a regression in https://github.com/django/django/commit/fe19b33e2f76045617067dd5123041ae4d3a91ee where the django.db.models.Choices.__str__ (which specifically called str(self.value)) method was removed to the profit of making IntegerChoices and TextChoices inherit from enum.ReprEnum). Unfortunaltly, this dropped the initial Choices.__str__ behaviour for all other subclasses of Choices.

I think the fix is as simple as making Choices inherit from enum.ReprEnum instead of enum.Enum.

I'm working on a PR.

Change History (4)

comment:1 by Antoine Humbert, 3 weeks ago

Owner: set to Antoine Humbert
Status: newassigned

comment:2 by Antoine Humbert, 3 weeks ago

Description: modified (diff)

comment:3 by Jacob Walls, 10 days ago

Cc: Nick Pope added
Keywords: enum added
Triage Stage: UnreviewedAccepted

Tentatively accepting, not sure how difficult the fix will be. A related case was discussed on the PR after merge, but it was dismissed since it was not strictly valid usage.

There, Nick explains:

I considered making Choices subclass ReprEnum, but it doesn't work because it expects a concrete base type to be provided.

So I'm not sure what we need to do instead.

comment:4 by Jacob Walls, 10 days ago

Has patch: set
Patch needs improvement: set

Just noticed the PR

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