簡體   English   中英

Django admin 多對多反轉?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM