views:

189

answers:

2

I have a model with field defined as

p = models.DecimalField(max_digits=12, decimal_places=6)

But the decimal_places=6 is only for internal accuracy. I only want 2 decimal_places to show up in the admin fields. So I thought perhaps I could do something with properties. But properties don't show up as fields in the Admin interface. E.g.: database record: 100.256754 admin edit field shows: 100.26

Is there a way to do this?

+1  A: 

If you want to simply display the value of the field but not make it editable you could use a custom template, or some javascript to mask / alter the value.

I have to question the wisdom though, of hiding the remaining digits from someone looking at the data. This smells like a disaster in the making as a person editing a field like that if you hid the values would not know what the full value is. If you really don't care about that from the user side, why store it in that manner at all.

wlashell
A: 

I'm with wlashell -- your edit form should display the raw value; otherwise, you'd be indirectly modifying the value each time the object got modified, even if the actual field wasn't changed at all. Probably not what you want.

If you'd simply like to change the way the field displays in the change list (for readability, perhaps), you can define a method on your model class like so:

from django.db import models
from django.template.defaultfilters import floatformat

class MyModel(models.Model):
    p = models.DecimalField(max_digits=12, decimal_places=6, verbose_name='My Field Name')
    ...

    def display_p(self):
        """Format `p` to 2 decimal places, for readability."""
        return floatformat(self.p, 2)
    display_p.short_description = 'My Field Name'
    display_p.admin_order_field = 'p'

Then, in your ModelAdmin subclass list_display you'd include display_p instead of p:

from django.contrib import admin
from myapp.models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    list_display = ['display_p', ...]
    ...

admin.site.register(MyModel, MyModelAdmin)

HTH.

elo80ka
The reason for not displaying the remaining digits is that the field contains financial data with 6 decimals accuracy but people are only used to deal with 2 digits accuracy.
Henri
Displaying the data to 2 decimal places in the change list makes sense; I'm only opposed to doing it in the change form.
elo80ka
I see your point. However many people who have to work with this data will start asking questions as to why the numbers are represented with 6 decimals instead of 2. In case you're interested my information sources are: http://speleotrove.com/decimal/decifaq.htmlhttp://speleotrove.com/decimal/decifaq1.htmlhttp://speleotrove.com/decimal/decifaq2.html#precision
Henri
Wow...great links Henri. Thanks!
elo80ka