更改管理编辑窗口显示值

时间:2010-04-13 15:07:30

标签: django admin

我有一个数据库表,例如重量值,例如

CREATE TABLE product (
    id SERIAL  NOT NULL,
    product_name item_name  NOT NULL,
    .
    .

    weight NUMERIC(7,3), -- the weight in kg
    .
    .
    CONSTRAINT PK_product PRIMARY KEY (id)
);

结果是模型:

class Product(models.Model):
    .
    weight = models.DecimalField(max_digits=7, decimal_places=3, blank=True, null=True)
    .

我以kg为单位存储重量,即1 kg存储为1,0.1 kg或100g存储为0.1

为了方便用户,我通过指定:

在管理列表显示中以克为单位显示权重
def show_weight(self):
    if self.weight:
        weight_in_g = self.weight * 1000
        return '%0f' % weight_in_g

因此,如果产品重量如0.5千克并且如此存储在数据库中,管理列表显示500

是否还有一种方法可以更改“更改产品”窗口中显示的数字。该窗口现在显示从数据库中提取的值,即0.5。当我告诉他用help_text输入g中的数字,同时看到kgs的数量时,这会让用户感到困惑。

在保存产品之前,我按以下方式覆盖保存:

def save(self):
    if self.weight:
        self.weight = self.weight / 1000

这会将以克为单位输入的数字转换为kgs。

2 个答案:

答案 0 :(得分:1)

像这样的模型的保存方法会产生意想不到的结果,而且可能不是你想要的。你看,每次保存模型时,它的重量都会变小1000倍。

最好添加自定义ModelForm并覆盖ModelAdmin.save_model。在这里,我们去了,灵感的一个小例子(没有以任何方式测试):

class ProductForm(forms.ModelForm):
    weight_gramms = forms.IntegerField(...)

    class Meta:
        model = ProductModel
        exclude = ('weight',)

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.initial['weight_gramms'] = int(self.instance.weight * 1000)

class ProductAdmin(admin.ModelAdmin):
    form = ProductForm

    def save_model(self, request, obj, form, change):
        obj.weight = form.cleaned_data['weight_gramms'] / 1000.0
        obj.save()

答案 1 :(得分:0)

为什么不使用整数,只存储重量克?