Opened 5 hours ago

Last modified 5 hours 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 — at Initial Version

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

Description

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/antoinehumbert/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 (0)

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