Django管理员覆盖FK字段并在Admin中公开

时间:2018-04-04 14:30:50

标签: django django-admin

我有一个简单的模型:

class Tier(models.Model):
    number_groups = models.PositiveIntegerField(null=True, blank=True)

哪个可以是另一个模型的FK:

class Account(models.Model):
    tier = models.ForeignKey(
        AccountTier,
        null=True,
        on_delete=models.PROTECT)
    number_groups = models.PositiveIntegerField(null=True, blank=True)

可以在number_groups模型中覆盖Account属性。这允许我的用户在管理页面中从预定义的Tier实例列表中选择。有时,用户可能希望将特定值设置为number_groups,该值应仅存在于帐户实例中。

我在想一个直接的方法是使用Account模型中的方法:

def number_groups(self):
    if self.number_groups:
        return self.number_groups
    elif self.tier:
        return self.tier.number_groups
    return self.number_groups

但是使用这种方法我不能使这个字段出现在Admin中,它被定义:

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    fields = ('number_groups',)

让管理员正确显示此字段并允许在Account实例中覆盖该字段的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

可以向admin.ModelAdmin添加自定义字段:

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    fields = ('get_number_groups', )
    readonly_fields = ('get_number_groups', )

    def get_number_groups(self, obj):
        return obj.number_groups()

    # Optional:
    # get_number_groups.short_description = 'foobar'