#35177: Admin.display decorator functions do not output correct-format for
'modern'
Python string-formatting
-------------------------------------+-------------------------------------
Reporter: stephenskett | Owner: nobody
Type: Bug | Status: new
Component: contrib.admin | Version: 4.2
Severity: Normal | Resolution:
Keywords: admin, display, | Triage Stage:
string, format, | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by stephenskett:
Old description:
> I am trying to write an admin display function (using the
> [https://github.com/django/django/blob/main/django/contrib/admin/decorators.py
> admin.display decorator]) to output the values of a float-field to 3
> decimal places.
>
> Seemed like this should be pretty simple, and indeed it is, **IF** you
> use 'old-style' Python format-strings, e.g.
> {{{
> class ModelFoo_Admin(admin.ModelAdmin):
> @admin.display
> def get_value_to_3dp(self, obj):
> return "%.3f" % obj.bar
> }}}
>
> However, if you use either of the more 'modern'-style Python string-
> formatting methods (i.e.
> [https://docs.python.org/3/tutorial/inputoutput.html#the-string-format-
> method str.format] or
> [https://docs.python.org/3/tutorial/inputoutput.html#formatted-string-
> literals formatted string-literals]), the specified string is not
> displayed using the specified formatting, i.e. this:
> {{{
> class ModelFoo_Admin(admin.ModelAdmin):
> @admin.display
> def get_value_to_3dp(self, obj):
> return "{0:3f}".format(obj.bar)
> }}}
> or this:
> {{{
> class ModelFoo_Admin(admin.ModelAdmin):
> @admin.display
> def get_value_to_3dp(self, obj):
> return f'{obj.bar:3f}'
> }}}
> display the output string to the default number of decimal-places (in my
> case, 6), with trailing zeroes, rather than to 3 decimal places as
> expected.
>
> I don't understand why there would be any difference between these
> approaches, so I am assuming this is a bug rather than the intended
> behaviour.
New description:
I am trying to write an admin display function (using the
[https://github.com/django/django/blob/main/django/contrib/admin/decorators.py
admin.display decorator]) to output the values of a float-field to 3
decimal places.
Seemed like this should be pretty simple, and indeed it is, **IF** you use
[https://docs.python.org/3/library/stdtypes.html#old-string-formatting
'old-style' Python format-strings], e.g.
{{{
class ModelFoo_Admin(admin.ModelAdmin):
@admin.display
def get_value_to_3dp(self, obj):
return "%.3f" % obj.bar
}}}
However, if you use either of the more 'modern'-style Python string-
formatting methods (i.e.
[https://docs.python.org/3/library/stdtypes.html#str.format str.format] or
[https://docs.python.org/3/reference/lexical_analysis.html#f-strings
formatted string-literals]), the specified string is not displayed using
the specified formatting, i.e. this:
{{{
class ModelFoo_Admin(admin.ModelAdmin):
@admin.display
def get_value_to_3dp(self, obj):
return "{0:3f}".format(obj.bar)
}}}
or this:
{{{
class ModelFoo_Admin(admin.ModelAdmin):
@admin.display
def get_value_to_3dp(self, obj):
return f'{obj.bar:3f}'
}}}
display the output string to the default number of decimal-places (in my
case, 6), with trailing zeroes, rather than to 3 decimal places as
expected.
I don't understand why there would be any difference between these
approaches, so I am assuming this is a bug rather than the intended
behaviour.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/35177#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018d8dcfe671-12ce01fd-fb84-4fa3-9c44-dc451a3b8721-000000%40eu-central-1.amazonses.com.