Django Admin - 多对多字段困惑

1 投票
2 回答
782 浏览
提问于 2025-04-15 23:11

我正在自学Django,并创建一个个人作品集网站。我设置了一个叫FolioItem的模型,它和另一个叫FolioImage的模型之间有多对多的关系。简单来说,每个FolioItem可以有很多FolioImage。

class FolioImage(models.Model):
    image = models.FileField(upload_to='portfolio_images')
    def __unicode__(self):
        return self.image.name

class FolioItem(models.Model):
    title = models.CharField(max_length=50)
    thumbnail = models.FileField(upload_to='portfolio_images')
    images = models.ManyToManyField(FolioImage)
    def __unicode__(self):
        return self.title

在Django的管理界面中,我可以创建新的FolioItem,但在图片字段(也就是和FolioImage的多对多关系)里,显示的是之前添加到其他FolioItem中的所有FolioImage。

其实这个地方应该是空的,因为这是一个新项目,还没有任何关联的图片。有没有办法让这个选择框在创建新项目时保持空白呢?

另外,当我尝试编辑一个已有的条目时,似乎无法添加或删除FolioImage的关联(小绿加号图标没有出现)。

如果能给点建议就太好了。

2 个回答

1

有没有办法让这个选择器在创建新项目时保持空白?

我觉得你对默认的多选小工具有点误解。它会显示所有现有的图片,给你作为选择,但对于一个全新的项目来说,这些图片并没有关系。你需要实际点击一个项目,或者使用shift(或control)点击来选择多个项目,然后保存你的项目,才能建立这种关系。

另外,当我尝试编辑一个已有的条目时,似乎无法添加或删除FolioImage的关联(小绿加号图标不见了)。

同样,我觉得你只需要点击或ctrl点击来选择或取消选择你想要关联的图片。

你可能还会对使用Django的酷炫的水平或垂直过滤器感兴趣,而不是默认的多选界面。你也可以使用内联界面。更多细节可以在这里这里找到。我觉得过滤器界面更加直观。

1

我觉得你这里用错了关系。如果你只是想让FolioImages属于一个单独的FolioItem,那么你应该在FolioImage和FolioItem之间使用一个外键(ForeignKey)。这样的话,你可以设置管理界面,让相关的图片以嵌套表单的形式显示,这样就可以只添加和编辑那个项目的图片了。

撰写回答