Django的管理员filter_horizontal
设置提供了一个漂亮的小部件来编辑多对多关系。但是它是一个特殊的设置,需要一个字段列表,因此只能在(定义了ManyToManyField
的)模型的(管理员)上使用;如果我想要在(另一个模型的管理员中)反向读取关系,如何获得相同的小部件?
我的模型看起来像这样(可以忽略User
/UserProfile
的复杂性;虽然这是真实用例):
class Site(models.Model):
pass
class UserProfile(models.Model):
user = models.OneToOneField(to=User,unique=True)
sites = models.ManyToManyField(Site,blank=True)
使用以下方法可以在UserProfile
的管理表单中获取一个漂亮的小部件:
filter_horizontal = ('sites',)
但我不知道如何在Site
管理界面上获得相同的功能。
我也可以通过添加一个内联到SiteAdmin
来实现一部分,定义如下:
class SiteAccessInline(admin_module.TabularInline):
model = UserProfile.sites.through
这种方法非常繁琐且不太方便;该小部件根本不直观,无法简单地管理多对多关系。
最后,有一个技巧在这里描述,涉及在Site
上定义另一个ManyToManyField
并确保它指向相同的数据库表(因为 Django 并不是真正设计用于在不同模型上具有描述相同数据的不同字段)。我希望有人可以给我展示更为简洁的方法。