Django在多个外键的管理员中内联

时间:2018-04-06 23:57:33

标签: django django-models django-forms

我有3个模型:Document,MetaData,MetaDataValue和一个“连接器表”DocumentMetaDataValue。我想在一个管理页面上添加文档和所有相关的元数据值。

models.py:
# MetaData        
class MetaData(models.Model):
    metadata_id = models.AutoField(primary_key = True)
    name = models.CharField('metadata name', max_length=200, unique=True)
    description = models.TextField('description')

    def __str__(self):
        return self.name

# MetaData Value                   
class MetaDataValue(models.Model):
    metadata_id = models.ForeignKey(MetaData, on_delete=models.CASCADE,)
    value = models.CharField('value', max_length=200, unique=True)

    def __str__(self):
        return self.value

# Document               
class Document(models.Model):
    document_id = models.AutoField(primary_key=True)
    metadata = models.ManyToManyField('MetaData', through='DocumentMetaDataValue', through_fields=('document', 'metadata'))
    metadatavalue = models.ManyToManyField('MetaDataValue', through='DocumentMetaDataValue', through_fields=('document', 'metadataValue'))

class DocumentMetaDataValue(models.Model):
    document = models.ForeignKey(Document, on_delete=models.CASCADE)
    metadata = models.ForeignKey(MetaData, on_delete=models.CASCADE)
    metadataValue = models.ForeignKey(MetaDataValue, on_delete=models.CASCADE)

admin.py:
class Fred(forms.ModelForm):
    """ something newer
    """
    class Meta:
        model = DocumentMetaDataValue
        fields = '__all__'

class DocumentMetaDataValueInline(admin.TabularInline):
    model = DocumentMetaDataValue
    form = Fred

class DocumentAdmin(admin.ModelAdmin):
    form = DocumentForm
    list_display = ('get_document_type', 'document_state', 'title', 'description', 'original_file_name', 'created', 'storage_file_name', 'get_thumb', )
    ordering = ('created',)
    readonly_field = ('document_state',)
    filter_horizontal = ('metadata', 'metadatavalue', )
    inlines = (DocumentMetaDataValueInline, )
    # other code not related to this problem

admin.site.register(Document, DocumentAdmin)

有16个以上的元数据名称,每个名称都有一个或多个元数据值。例如,元数据名称Person有23个值('Bob','Sam','Sally'等),元数据名称Decade有12个值(1890,1900,1910,1920等)。文档可以具有与其关联的一个或多个元数据名称,并且该元数据名称的一个或多个元数据值可以与该文档相关联。例如,文档可以是包含两个人的照片。 Decade的元数据值可以是1910年,Person的元数据值可以是Sam和Sally。

在内联的每一行上,我想显示与下拉列表相对应的元数据名称以及相关的元数据值。应该能够为特定元数据名称选择多个元数据值。desired result

上面代码中发生的情况是内联的每一行都有两个下拉列表 - 第一个是所有元数据名称,第二个是所有元数据值。 current code output

我想将第一个下拉列表更改为元数据名称的单个字符串,第二个下拉列表仍然是下拉列表,但只是该元数据名称的值。我不知道如何做出这些改变。

谢谢!

标记

0 个答案:

没有答案
相关问题