【问题标题】:using properties in Django Admin在 Django Admin 中使用属性
【发布时间】:2010-12-31 06:59:59
【问题描述】:

我有一个字段定义为的模型

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

但 decimal_places=6 仅用于内部精度。我只希望 2 个 decimal_places 显示在管理字段中。所以我想也许我可以用属性做点什么。但是属性不会在管理界面中显示为字段。例如:数据库记录:100.256754 管理员编辑字段显示:100.26

有没有办法做到这一点?

【问题讨论】:

    标签: django models admin decimal


    【解决方案1】:

    我支持 wlashell -- 您的编辑表单应该显示原始值;否则,每次修改对象时,您都会间接修改值,即使实际字段根本没有更改。可能不是你想要的。

    如果您只想更改字段在更改列表中的显示方式(也许是为了便于阅读),您可以在模型类上定义一个方法,如下所示:

    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'
    

    然后,在您的 ModelAdmin 子类 list_display 中,您将包含 display_p 而不是 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。

    【讨论】:

    • 不显示剩余位数的原因是该字段包含精确到小数点后6位的财务数据,但人们只习惯处理2位精确度。
    • 在更改列表中将数据显示到小数点后 2 位是有意义的;我只是反对在变更表格中这样做。
    • 我明白你的意思。然而,许多必须使用这些数据的人会开始询问为什么这些数字用 6 位小数而不是 2 位表示。如果您有兴趣,我的信息来源是:speleotrove.com/decimal/decifaq.htmlspeleotrove.com/decimal/decifaq1.htmlspeleotrove.com/decimal/decifaq2.html#precision跨度>
    • 哇...伟大的链接亨利。谢谢!
    【解决方案2】:

    如果您只想显示字段的值但不能使其可编辑,您可以使用自定义模板或一些 javascript 来屏蔽/更改值。

    不过,我不得不质疑对查看数据的人隐藏剩余数字的智慧。这闻起来像是一场灾难,因为编辑这样的字段的人如果隐藏这些值将不知道完整值是什么。如果您真的不关心用户方面的问题,那为什么要以这种方式存储它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-02
      • 2012-07-08
      • 2011-01-16
      • 2022-01-05
      • 2019-04-23
      • 2016-10-23
      • 1970-01-01
      相关资源
      最近更新 更多