[英]Django admin many-to-many reversed?
問題Django admin ManyToMany inline "has no ForeignKey to" 錯誤的答案是指 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 可以從群組頁面管理群組成員資格並將其從個人頁面中排除嗎?
如果管理員只想從群組頁面管理成員怎么辦?
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass
@admin.register(Group)
class GroupAdmin(admin.ModelAdmin):
pass
默認情況下,Django 在 GroupAdmin 中顯示一個 Person m2m 小部件。 您正確使用 through 模型來獲取內聯,但內聯是不受排除影響的單獨定義。 編輯:另一種簡單的表達方式是,您只需在您想要的 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 上測試)
您沒有為此聲明提供參考:
Django 文檔(可能是錯誤的)說“你必須告訴 Django 的管理員不要顯示這個小部件”。
所以我只能參考Django的當前(1.10)文檔。 它目前表示管理中的ManyToMany 字段:
Django 在定義關系的模型上顯示多對多字段的管理小部件(在本例中為
Group
)。 如果你想使用內聯模型來表示多對多關系,你必須告訴 Django 的管理員不要顯示這個小部件 - 否則你最終會在你的管理頁面上有兩個小部件來管理關系。
所以,為了回應你的正確陳述:
但是,由於它是一種對稱關系,因此在不更改數據庫架構的情況下不能從 Person 或 Group(但不能同時從兩者)管理它是沒有邏輯的。
原因是多對多關系必須在某處定義; 您已選擇在 Group 模型上定義它,以便確定默認管理行為。 如果你想移動它,那么你需要進行數據庫遷移來實現它。
另一方面,如果您希望在不改變對它的使用的情況下使這種記錄的行為有所不同 - 您似乎沒有提出適合 StackOverflow 的問題。 最好在項目的錯誤跟蹤器中報告程序的錯誤,要求更改軟件的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.