7

我有多个模型,多个 DecimalField 代表钱,比如 100.34 欧元。

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

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

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

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

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

查了一下django admin的源码,终于发现了问题:

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

elif isinstance(field, models.DecimalField):
    return formats.number_format(value, field.decimal_places) 

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

我怎么解决这个问题?

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

4

3 回答 3

9

为了在管理列表中显示,您可以在您的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
于 2013-09-12T12:05:19.617 回答
1

或者创建一个这样的类并从它继承

class ImprovedAdmin(admin.ModelAdmin):
    """Handles column formatting in list display"""
    def __init__(self, *args, **kwargs):
        def generate_formatter(name, str_format):
            formatter = lambda o: str_format%(getattr(o, name) or 0)
            formatter.short_description = name
            formatter.admin_order_field = name
            return formatter

        all_fields = []
        for f in self.list_display:
            if isinstance(f, basestring):
                all_fields.append(f)
            else:
                new_field_name = f[0]+'_formatted'
                setattr(self, new_field_name, generate_formatter(f[0], f[1]))
                all_fields.append(new_field_name)
        self.list_display = all_fields

        super(ImprovedAdmin, self).__init__(*args, **kwargs)


class MyModelAdmin(ImprovedAdmin):
    list_display = ('id', ('amount', '%.2f EUR'), ('interest', '%.2f %%'))
于 2016-12-23T10:09:07.497 回答
0

Django 管理员部分支持之前0.12版本的货币表示。django-money

0.12版本(于 22.10.2017 发布)以来,所有MoneyField表示(包括 Django 的管理员)都可以使用特殊的 formatter进行配置。

import moneyed
from moneyed.localization import _FORMATTER
from decimal import ROUND_HALF_EVEN


BOB = moneyed.add_currency(
    code='BOB',
    numeric='068',
    name='Peso boliviano',
    countries=('BOLIVIA', )
)

# Currency Formatter will output 2.000,00 Bs.
_FORMATTER.add_sign_definition(
    'default',
    BOB,
    prefix=u'Bs. '
)

_FORMATTER.add_formatting_definition(
    'es_BO',
    group_size=3, group_separator=".", decimal_point=",",
    positive_sign="",  trailing_positive_sign="",
    negative_sign="-", trailing_negative_sign="",
    rounding_method=ROUND_HALF_EVEN
)
于 2017-10-29T14:43:15.107 回答