在Admin add/change视图中自定义Django GenericRelation内容类型值
我的模型正在使用在Admin add/change视图中自定义Django GenericRelation内容类型值,django,Django,我的模型正在使用GenericForeignKey和genericorrelations。为了简化,我的模型结构如下: class BaseModel(models.Model): name = models.CharField(max_length=100) model_labels = models.GenericRelation('ModelLabel', related_query_name='%(class)s') model_types = models
GenericForeignKey
和genericorrelations
。为了简化,我的模型结构如下:
class BaseModel(models.Model):
name = models.CharField(max_length=100)
model_labels = models.GenericRelation('ModelLabel', related_query_name='%(class)s')
model_types = models.GenericRelation('ModelType'), related_query_name='%(class)s')
class Meta:
abstract = True
class ModelA(BaseModel):
fieldA = models.CharField(max_length = 50)
class ModelB(BaseModel):
fieldB = models.CharField(max_length = 50)
class ModelLabel(models.Model);
label = models.CharField(max_length = 50)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
model_object = GenericForeignKey('content_type', 'object_id')
class ModelType(models.Model):
type = models.CharField(max_length = 50)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
model_object = GenericForeignKey('content_type', 'object_id')
class Unrelated(models.Model):
name = models.CharField(max_lenght = 50)
我面临的问题是modelabel
和ModelType
的管理视图。现在,我得到了3个字段:标签
或类型
,内容类型
和对象id
。是的,根据模型,这是正确的
但是在内容类型
中,我得到的不仅仅是ModelA
和ModelB
。我还得到了不相关的,以及不同型号的大多数单个字段。根据:
ContentType的实例表示并存储有关
安装在项目中的模型以及ContentType的新实例
在安装新模型时自动创建
根据这一点,不相关的
可以出现在值中,但是模型的字段不应该出现。那么它们为什么会出现呢
然而,这并不是我正在努力解决的主要问题。我想将内容类型中可供选择的选项列表缩小到ModelA
和ModelB
。从我收集的信息来看,因为这是引擎盖下的ForeignKey
,我应该可以使用,但我需要使用一些硬编码的QuerySet
,但我找不到如何制作,例如从字典中。类似的还有对象id
,我希望能够根据可用的数字选择要使用的值
到目前为止,我意识到我很可能需要扩展admin.ModelAdmin
视图,也很可能需要创建自定义表单(扩展forms.ModelForm
)。这也是一种理论,因为到目前为止,我还没有找到一种方法来提到自定义QuerySet
或对象id
。这种方法还有一些缺点,因为如果我选择使用这种方法,我需要为每个模型定制表单(modelabel
,ModelType
)-这真的有必要吗
我知道有一种添加GenericInlineModelAdmin类的方法,但此视图允许添加类型为ModelLabel
的对象以及ModelB
。这不包括类型为ModelB
的对象已经存在的情况
总结一下我想要实现的主要目标:
修复管理员视图以创建模型标签
和模型类型
将内容类型
字段的选项列表缩小到ModelA
和ModelB
允许用户仅为对象id
字段选择现有id