gpt4 book ai didi

python - Django 管理多对多反转?

转载 作者:太空狗 更新时间:2023-10-29 21:59:33 26 4
gpt4 key购买 nike

问题的答案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 可以从组页面管理组成员并将其从人员页面中排除吗?

最佳答案

what if the administrator wants to manage members only from the Group page?

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass

@admin.register(Group)
class GroupAdmin(admin.ModelAdmin):
pass

默认情况下,Django 在 GroupAdmin 中显示一个 Person m2m 小部件。您正确使用直通模型来获取内联,但内联是一个独立的定义,不受排除的影响。编辑:另一种简单的表达方式是,您只需在 Admin 上指定内联,而无需在对方的 Admin 上指定它们。

使用内联:

from core.models import Group, Person

class MembershipInline(admin.TabularInline):
model = Group.members.through

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass

@admin.register(Group)
class GroupAdmin(admin.ModelAdmin):
inlines = [MembershipInline, ]
exclude = ('members',)

(在 Django 3.0.3 上测试)

关于python - Django 管理多对多反转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32017413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com