2017-07-19 4 views
0

Ich werde schnell wieder aufnehmen, so dass Sie die Struktur besser verstehen:Wie für ein ManyToMany Feld Kontrollkästchen in Django Admin verwenden, durch ein Modell

Die Autos kann durch verschiedene Treiber und diese angetrieben werden Treiber können Trophäen bekommen. Trophäen müssen den Fahrern und dem Auto, das sie benutzten, zugeordnet werden.

class CarDriver(models.Model): 
    driver = models.ForeignKey('Driver', null=False) 
    car = models.ForeignKey('Car', null=False) 
    trophies = models.ManyToManyField('Trophy', blank=True) 


class Driver(models.Model): 
    name = models.CharField(max_length=255) 


class Car(models.Model): 
    name = models.CharField(max_length=255) 
    drivers = models.ManyToManyField(Driver, blank=True, through=CarDriver) 


class Trophy(models.Model): 
    position = models.IntegerField(default=1) 

Ich möchte das Modell Auto in Django Admin anzuzeigen, sondern eine Liste von Kontrollkästchen mit den Treiber zu wählen, so dass der Fahrer Auswahl wird viel schneller als die Verwendung von inlines:

class CardDriverInline(admin.TabularInline): 
    model = CarDriver 


class CarAdmin(admin.ModelAdmin): 
    inlines = [ 
     CardDriverInline, 
    ] 


admin.site.register(Car, CarAdmin) 

Ist Gibt es eine Möglichkeit, Kontrollkästchen für die Auswahl mehrerer Treiber zu verwenden?

Antwort

0

Nach dem Django docs, wenn Sie ein durch Argument einer ManyToManyField, wird der Administrator nicht ein Widget standardmäßig angezeigt werden soll.

Also, in diesem Fall müssen Sie Inlines verwenden, leider.

Wenn Sie jedoch keinen durch Argument verwenden, können Sie einfach eine Modeladmin wie folgt aus:

class CarAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.ManyToManyField: {'widget': CheckboxSelectMultiple}, 
    } 

Auf diese Weise können die Kontrollkästchen, aber Sie verlieren die Referenz Trophäen.

Ich weiß, es ist keine gerechte Welt. Ich dachte, es gäbe einen anderen Weg, aber die Django-Dokumentation ist klar, warum Sie Inlines mit dem Argument bis verwenden müssen.

Verwandte Themen