如何在Django Admin中通过模型使用ManyToMany字段中的复选框

时间:2017-07-19 18:25:24

标签: django django-models django-admin

我会快速制作一份简历,以便您更好地理解结构:

汽车可以由不同的驱动程序驱动,这些驱动程序可以获得奖杯。奖杯必须与司机和他们使用的汽车相关联。

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)

我想在Django Admin中显示模型Car但是使用复选框列表来选择驱动程序,因此驱动程序选择将比使用内联更快

class CardDriverInline(admin.TabularInline):
    model = CarDriver


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


admin.site.register(Car, CarAdmin)

有没有办法使用复选框来选择多个驱动程序?

1 个答案:

答案 0 :(得分:0)

根据Django docs,当您对 ManyToManyField 使用参数时,管理员默认情况下不会显示小部件。

因此,在这种情况下,必须不幸地使用内联。

但是,如果您不使用参数,则可以像这样使用 ModelAdmin

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

这样你就有了复选框,但你失去了奖杯参考。

我知道,这不是一个公平的世界。我认为它会以另一种方式存在,但Django文档清楚地说明了为什么必须使用参数的内联。