在 Django 管理中显示带有货币的 DecimalField

Mat*_*ppo 7 python django decimal django-admin currency-formatting

我有多个模型,其中多个 DecimalField 代表货币,例如 100.34 EUR。

我的目标是在管理列表视图中显示货币,如图所示

http://i.imgur.com/XKEQFp9.png

但是,我无法为每个货币领域找到一种方法。

我尝试创建一个自定义 MoneyField,从 DecimalField 继承并更改unicode表示,但它没有用。

我也尝试过https://github.com/jakewins/django-money但我没有运气。

查了一下django admin的源码,终于找到了问题所在:

在 django.admin.contrib.admin.util.py 的 display_for_field 函数中,它检查该值是否是 DecimalField 的实例。如果是这种情况,它会像十进制数一样显示它。

elif isinstance(field, models.DecimalField):
    return formats.number_format(value, field.decimal_places) 
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但它阻止我在管理中显示欧元符号/文本。

我怎么解决这个问题?

我知道我可以简单地为每个字段使用一种方法,将格式化的值显示为字符串,但我想知道是否有 DRYer 方法。

aug*_*men 7

为了在管理列表中显示,您可以在您的ModelAdmin类中创建一个自定义函数,该函数将被调用以格式化每个值:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('formatted_amount', ...other fields...,)

    def formatted_amount(self, obj):
        # obj is the Model instance

        # If your locale is properly set, try also:
        # locale.currency(obj.amount, grouping=True)
        return '%.2f EUR' % obj.amount
Run Code Online (Sandbox Code Playgroud)

  • 当然,但我必须为每个领域制定一个方法。感觉不像是 DRY 解决方案 (5认同)
  • 您还可以在单​​独的行上添加“formatted_amount.short_description = 'amount'”来修复列标题。 (2认同)
  • @DataGreed为了添加排序只需添加(基于上面的示例)formatted_amount.admin_order_field =“amount” (2认同)