在Django admin中使用ManyToMany的动态字段

时间:2014-01-15 12:31:27

标签: python django django-models django-admin

我想在另一个模型中为我的模型定义一些字段。这里:

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

    def __unicode__(self):
        return self.name

class Option(models.Model):
    name = models.CharField(max_length=255)
    setting = models.ForeignKey(Setting)

    def __unicode__(self):
        return self.name

class Car(models.Model):
    hsn = models.PositiveIntegerField("HSN", max_length=4)
    tsn = models.PositiveIntegerField("TSN", max_length=3)
    mileage = models.PositiveIntegerField("Kilometerstand")
    settings = models.ManyToManyField(Setting)

在管理员中,我想将每个Settings.name作为CarAdmin中的一个字段,并带有一个选项框Options.name

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题并解决了下面的问题,我相信它应该可以解决问题。

您想要的是将设置设置为Car changeform中的内联,并将M2M字段指向设置内联中的选项,覆盖其窗口小部件以将其显示为复选框。

在models.py中:

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

    def __unicode__(self):
        return self.name

class Car(models.Model):
    hsn = models.PositiveIntegerField("HSN", max_length=4)
    tsn = models.PositiveIntegerField("TSN", max_length=3)
    mileage = models.PositiveIntegerField("Kilometerstand")

    def __unicode__(self):
        return self.hsn


class Setting(models.Model):
    name = models.CharField(max_length=255)
    options = models.ManyToManyField(Option, blank=True, null=True)
    car = models.ForeignKey(Car, blank=True, null=True)

    def __unicode__(self):
        return self.name

在您的admin.py中:

from django.forms import CheckboxSelectMultiple

class OptionAdmin(admin.ModelAdmin):
    pass

admin.site.register(Option, OptionAdmin)

class SettingInline(admin.TabularInline):

    model = Setting
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
    }


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

admin.site.register(Car, CarAdmin)

这个解决方案可能有一些注意事项,例如每个设置的常用选项或复选框下面的错误帮助文本,我没有进一步看,但它应该是可修复的。