【发布时间】:2015-11-08 03:26:54
【问题描述】:
问题Django admin ManyToMany inline "has no ForeignKey to" error 的答案参考了Django Admin 文档。那里给出的模型是:
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, related_name='groups')
内联管理类是:
class MembershipInline(admin.TabularInline):
model = Group.members.through
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
class GroupAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('members',)
... 允许从“个人”页面而不是“组”页面管理组成员资格。但是,如果管理员只想从“组”页面管理成员怎么办?去掉 exclude 行将允许两个页面管理关系,但是 Django 文档(可能不正确)说“你必须告诉 Django 的管理员不要显示这个小部件”。他们可能的意思是你“应该”告诉 Django 的管理员不要显示它——如果你不这样做不会发生任何不好的事情,但这是多余的。
因此,在不更改模型的情况下,是否可以从“个人”页面而不是“组”页面中排除成员资格小部件?两种明显的尝试:
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('Group.members',)
和
class PersonAdmin(admin.ModelAdmin):
inlines = [MembershipInline,]
exclude = ('groups',)
(第二个使用模型中的related_name)失败并出现错误:
'PersonAdmin.exclude' refers to field 'groups' that is missing from the form.
是的,可以更改模型以将ManyToManyField 放在Person 下。但由于它是一种对称关系,所以没有任何逻辑理由不能从 Person 或 Group(但不能同时从两者)进行管理,而无需更改数据库模式。 Django Admin 可以从群组页面管理群组成员资格并将其从人员页面中排除吗?
【问题讨论】:
标签: python django django-models django-admin