gpt4 book ai didi

python - 将 Django 管理站点用于模型的特定实例

转载 作者:搜寻专家 更新时间:2023-10-30 23:26:01 25 4
gpt4 key购买 nike

我正在开发我的第一个 Django 应用程序,并且正在考虑使用一个相当抽象的数据库模式,如下所示:

class ListCategories(models.Model):
name = models.TextField(max_length=200)
type = models.TextField(max_length=200)

class ListItems(models.Model):
category = models.ForeignKey('ListCategories', on_delete=models.CASCADE)
item = models.TextField(max_length=200)
sorstorder = models.IntegerField()

class ObjectType(models.Model):
name = models.TextField(max_length=200)

class Object(models.Model):
type = models.ForeignKey('ObjectType', on_delete=models.CASCADE)
name = models.TextField(max_length=200)

class ObjectTypeProperties(models.Model):
name = models.TextField(max_length=200)
object_type = models.ForeignKey('ObjectType', on_delete=models.CASCADE)
list_category = models.ForeignKey('ListCategories', null=True, on_delete=models.CASCADE)

class ObjectProperties(models.Model):
object = models.ForeignKey('Object', on_delete=models.CASCADE)
property = models.ForeignKey('ObjectTypeProperties', on_delete=models.CASCADE)
list_item = models.ForeignKey('ListItems', on_delete=models.CASCADE)
result = models.TextField(max_length=200)

class HistoricalNumericalData(models.Model):
object = models.ForeignKey('Object', on_delete=models.CASCADE)
object_property = models.ForeignKey('ObjectProperties', on_delete=models.CASCADE)
value = models.FloatField()

class Image(models.Model):
object = models.OneToOneField('Object',on_delete=models.CASCADE)
image = models.ImageField()

def image_tag(self):
return mark_safe('<img src="{}"/>'.format(self.image.url))

image_tag.short_description = 'Image'

这在数据库上非常灵活,因为您可以通过简单地向数据库添加行来添加对象类型和对象属性。但是,我想使用管理界面将新对象添加到数据库中,这就是该架构难以使用的地方。但是,每种对象类型的表单都需要不同,因为它们具有不同的属性。

有没有一种方法可以注册模型以用于根据模型中的字段表现不同的管理站点?在我的例子中,Object.type 字段将决定表单的性质。

只定义更具体的模型会更好吗?

最佳答案

您可以尝试使用 ModelAdmin.get_fieldsets() 方法,当您收到一个对象实例时,您可以修改要发布的字段集,查看文档 -> https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_fieldsets

否则,您可以探索使用 ModelAdmin.get_form(),为每个 Object.type 构建自定义表单并为每种情况实例化适当的表单,文档在这里 -> https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form

希望这能让您走上正确的道路。

G.

关于python - 将 Django 管理站点用于模型的特定实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com