Opened 94 minutes ago
Last modified 91 minutes 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: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
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 (2)
comment:1 by , 93 minutes ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:2 by , 91 minutes ago
| Description: | modified (diff) |
|---|