我有一个模型Cake
BakedCake
有一个指向Cake
的外键,并包含一个datetime类型的created_utc
字段
假设我有模型CupCake
,LemonCake
,CheeseCake
,每个模型都有一个外键字段baked_cake
来建模BakedCake
,因为它们共享这个行为和许多其他行为,它们都继承自同一基类BaseModel
现在,在CupCake
、LemonCake
、CheeseCake
的Django管理界面中,我们希望显示一个Cake
而不是BakedCake
的列表,因此该列表要短得多,更容易选择。因此,我们宁愿显示一个cake
列表,然后一旦用户选择了一个cake
,我们就使用当前日期时间和业务逻辑来设置保存时的适当baked_caked
演示代码:
# --- models.py
class Cake(models.Model):
name = models.CharField("Bar name", max_length=200, unique=True)
class BakedCake(models.Model):
cake = models.ForeignKey(Cake, on_delete=models.PROTECT)
created_utc = models.DateTimeField()
class BaseModel(models.Model):
baked_cake = models.ForeignKey(BakedCake, on_delete=models.PROTECT)
# -- Lots of other common business logic here --
class CupCake(BaseModel):
custom_field = models.CharField("Example1", max_length=200, unique=True)
class LemonCake(BaseModel):
other_field = models.BooleanField("Example2", default=True, )
class CheeseCake(BaseModel):
another_field = SmallFloatField("Example3", )
# --- admin.py
class BaseAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs) # This form object does not have .fields attribute
form.fields = [x for x in form.fields if x != 'baked_cake']
form.fields += 'cake'
return form
@admin.register(CupCake)
class CupCakeAdmin(BaseAdmin):
pass
@admin.register(LemonCake)
class LemonCakeAdmin(BaseAdmin):
pass
@admin.register(CheeseCake)
class CheeseCakeAdmin(BaseAdmin):
pass
不幸的是form.fields
对象上不存在form
。如何替换基类ModelAdmin
的字段,使其派生类也继承这些更改
我想做的不是在管理界面中显示原始模型的字段,而是显示另一个模型的备用字段,然后在保存时使用业务逻辑选择适当的原始字段。这需要在多个模型中发生,因此需要从基础模型继承逻辑
注意:使用Django 3
这个模型管理类的设置肯定有效(至少在Django3.1中是这样)
然后,注册你的模型
示例屏幕截图
注意:别忘了用你的逻辑完成
get_baked_cake_instance(...)
方法相关问题 更多 >
编程相关推荐