2014-01-15 4 views
0

Я хочу определить некоторые поля для моей модели в другой модели. Здесь:Динамические поля с ManyToMany в 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

Как я могу это сделать?

+0

Создайте свою собственную форму для использования modeladmin? – yuvi

ответ

0

Я столкнулся с аналогичной проблемой и решил ее, как показано ниже, я считаю, что это должно сделать трюк.

Вы хотите, чтобы настройки как встроенные в форму изменения автомобиля и поле M2M указывали на опции в настройке Inline, переопределяя его виджет, чтобы отображать его как флажки.

В вашем 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) 

Там могут быть некоторые оговорки с этим решением, такие как общие параметры для каждой установки или неуместной текста справки ниже флажков, я не смотрел дальше, но он должен быть исправен.

Смежные вопросы