【问题标题】:Django Admin. Auto update read_only fields based on other fieldsDjango 管理员。根据其他字段自动更新只读字段
【发布时间】:2020-05-14 15:10:54
【问题描述】:

这是我的模型类:

class House(models.Model):
    land_price_per_meter = models.PositiveIntegerField(default=0)
    land_area = models.PositiveIntegerField(default=0)
    land_price = models.PositiveIntegerField(default=0)

    build_price_per_meter = models.PositiveIntegerField(default=0)
    build_area = models.PositiveIntegerField(default=0)
    build_price = models.PositiveIntegerField(default=0)

    total_price = models.PositiveIntegerField(default=0)
    

这些字段是只读的: land_pricebuild_pricetotal_price

我希望 Django 自己在管理员 change_form 中计算 read_only 字段,如下所示(实时):

land_price = land_price_per_meter * land_area

build_price = build_price_per_meter * build_area

total_price = build_price + land_price

【问题讨论】:

    标签: django django-models django-forms django-admin


    【解决方案1】:

    你可以在 admin.py

    class HouseAdmin(admin.ModelAdmin):
        readonly_fields = ("calc_land_price",)
    
        def calc_land_price(self, instance):
            return land_price_per_meter * land_area
    
        calc_land_price.short_description = "land_price"
    

    但更好的解决方案是如果land_price 只是两个字段的乘积,则直接在模型@property 中创建,然后删除land_price。 models.py

    class House(models.Model):
        [...]
        @property
        def land_price(self):
            return land_price_per_meter * land_area
    

    【讨论】: