2015-08-14 19 views
7

Die Antwort auf die Frage Django admin ManyToMany inline "has no ForeignKey to" error bezieht sich auf die Django Admin Dokumentation. Die Modelle gegeben sind:Django Admin viele-zu-viele umgekehrt?

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') 

und die Inline-Admin-Klassen sind:

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

class PersonAdmin(admin.ModelAdmin): 
    inlines = [MembershipInline,] 

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

... die Gruppenmitgliedschaft ermöglicht von der Person Seite verwaltet werden, aber nicht von der Seite Gruppe. Was aber, wenn der Administrator nur Mitglieder von der Gruppenseite aus verwalten möchte? Wenn Sie die Zeile exclude loswerden, können beide Seiten die Beziehung verwalten, aber die Django-Dokumentation (wahrscheinlich falsch) sagt: "Sie müssen dem Django-Administrator mitteilen, dass er dieses Widget nicht anzeigen soll". Was sie wahrscheinlich meinen, ist, dass du Djangos Admin "sagen" solltest, es nicht anzuzeigen - nichts Schlimmes wird passieren, wenn du es nicht tust, aber es ist überflüssig.

Ohne die Modelle zu ändern, ist es also möglich, das Mitgliedswidget von der Personenseite auszuschließen, anstatt von der Gruppenseite? Beide offensichtliche Versuche:

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

und

class PersonAdmin(admin.ModelAdmin): 
    inlines = [MembershipInline,] 
    exclude = ('groups',) 

(der zweite die related_name vom Modell) nicht mit dem Fehler:

'PersonAdmin.exclude' refers to field 'groups' that is missing from the form. 

Ja, das Modell geändert werden könnte zu setzen die ManyToManyField unter Person. Da es sich jedoch um eine symmetrische Beziehung handelt, gibt es keinen logischen Grund, warum sie nicht von Person oder Gruppe (aber nicht von beiden) verwaltet werden könnte, ohne das Datenbankschema ändern zu müssen. Kann Django Admin die Gruppenmitgliedschaft von der Gruppenseite aus verwalten und von der Personenseite ausschließen?

Antwort

0

Sie keine Referenz für diese Behauptung geben:

the Django documentation (probably incorrectly) says "you must tell Django’s admin to not display this widget".

so kann ich auf die current (1.10) documentation for Django beziehen sich nur. Er sagt zur Zeit von ManyToMany fields in the admin:

Django displays an admin widget for a many-to-many field on the model that defines the relation (in this case, Group). If you want to use an inline model to represent the many-to-many relationship, you must tell Django’s admin to not display this widget - otherwise you will end up with two widgets on your admin page for managing the relation.

So, als Antwort auf Ihre korrekte Aussage:

But since it is a symmetric relationship, there is no logical reason why it could not be managed from either Person or Group (but not both) without having to change the database schema.

der Grund ist, dass die many-to-many-Beziehung irgendwo werden muss, definiert; Sie haben entschieden, sie im Gruppenmodell zu definieren, sodass das standardmäßige Administratorverhalten festgelegt wird. Wenn Sie es verschieben möchten, müssen Sie eine Datenbankmigration durchführen, um dies zu ermöglichen.

Wenn Sie andererseits wollen, dass dieses dokumentierte Verhalten anders ist ohne ändern Sie Ihre Verwendung von es - Sie scheinen nicht zu stellen eine Frage, die StackOverflow passt. Besser, einen Fehler mit dem Programm bei the project's bug tracker zu melden, um eine Änderung im Verhalten der Software zu bitten.

+1

Natürlich könnte ich das Schema neu definieren und die Datenbank migrieren, wie in der ursprünglichen Frage bestätigt. Es gibt keinen inhärenten technischen Grund dafür, dass die Admin-Schnittstelle zulässt, dass eine symmetrische Beziehung von einem Ende verwaltet wird, aber nicht von dem anderen - man sollte * entweder die Gruppen eines Mitglieds oder die Mitgliederliste einer Gruppe verwalten können wo die Beziehung definiert ist.Sie haben lediglich die dokumentierte Einschränkung neu formuliert und keine Begründung für ihre Existenz geliefert. – Dave