2014-01-15 76 views
0

我想在另一個模型中爲我的模型定義一些字段。在這裏:在Django中使用ManyToMany的動態字段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

的選擇框

我怎樣才能做到這一點的管理員?

+0

爲modeladmin創建自己的窗體? – yuvi

回答

0

我跑了一個類似的問題,並解決它,如下所示,我相信它應該做的伎倆。

你需要的是有設置,在您的汽車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) 

可能有一些注意事項使用此解決方案,如對每個設置或錯位的說明文字常用選項在複選框下面,我沒有看得更遠,但它應該是可修復的。

相關問題