Django Admin - 多对多字段困惑
我正在自学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 个回答
有没有办法让这个选择器在创建新项目时保持空白?
我觉得你对默认的多选小工具有点误解。它会显示所有现有的图片,给你作为选择,但对于一个全新的项目来说,这些图片并没有关系。你需要实际点击一个项目,或者使用shift(或control)点击来选择多个项目,然后保存你的项目,才能建立这种关系。
另外,当我尝试编辑一个已有的条目时,似乎无法添加或删除FolioImage的关联(小绿加号图标不见了)。
同样,我觉得你只需要点击或ctrl点击来选择或取消选择你想要关联的图片。
你可能还会对使用Django的酷炫的水平或垂直过滤器感兴趣,而不是默认的多选界面。你也可以使用内联界面。更多细节可以在这里和这里找到。我觉得过滤器界面更加直观。
我觉得你这里用错了关系。如果你只是想让FolioImages属于一个单独的FolioItem,那么你应该在FolioImage和FolioItem之间使用一个外键(ForeignKey)。这样的话,你可以设置管理界面,让相关的图片以嵌套表单的形式显示,这样就可以只添加和编辑那个项目的图片了。