2009-08-27 63 views
11

在我的models.py我有類似:如何在django admin中添加雙向多個文件夾?

class LocationGroup(models.Model): 
    name = models.CharField(max_length=200) 

class Report(models.Model): 
    name = models.CharField(max_length=200) 
    locationgroups = models.ManyToManyField(LocationGroup) 

admin.py(標準):

admin.site.register(LocationGroup) 
admin.site.register(Report) 

當我進入管理頁面的報告,它顯示了一個很好的選擇題場。如何在LocationGroup中添加相同的多選字段?我可以通過調用LocationGroup.report_set.all()

+0

相關機票:https://code.djangoproject.com/ticket/897 – guettli 2016-07-18 08:28:22

回答

8

我發現的解決方法是按照ManyToManyFields with intermediary models的說明操作。即使您沒有使用「通過」模型功能,只需假裝您是否在使用必要的ForeignKey創建存根模型即可。

# models: make sure the naming convention matches what ManyToManyField would create 
class Report_LocationGroups(models.Model): 
    locationgroup = models.ForeignKey(LocationGroup) 
    report = models.ForeignKey(Report) 

# admin 
class ReportInline(admin.TabularInline): 
    model = models.Report_LocationGroups 

class LocationGroupAdmin(admin.ModelAdmin): 
    inlines = ReportInline, 
+1

看起來相對最簡單的實現,thx! – 2009-10-06 09:11:09

+0

最簡單,但仍然是黑客。我希望Django能夠以更優雅的方式支持這一點。 – 2011-06-01 15:27:46

2

訪問所有的報告,我認爲馮可結合此示例代碼(source)至極休息SYNC_DB

class ItemType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    description = meta.CharField(maxlength=250) 
    properties = meta.ManyToManyField('PropertyType', 
      db_table='app_propertytype_itemtypes') 

class PropertyType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    itemtypes = meta.ManyToManyField(ItemType) 

this snippet

class ManyToManyField_NoSyncdb(models.ManyToManyField): 
    def __init__(self, *args, **kwargs): 
     super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs) 
     self.creates_table = False 

獲得像

class ItemType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    description = meta.CharField(maxlength=250) 
    properties = meta.ManyToManyField_NoSyncdb('PropertyType', 
      db_table='app_propertytype_itemtypes') 

class PropertyType(meta.Model): 
    name = meta.CharField(maxlength=100) 
    itemtypes = meta.ManyToManyField(ItemType) 

免責聲明:這只是一個粗略的想法

編輯:有可能是成才做Django's 1.1 Proxy Models

1

我覺得你這是要找的是admin inlines。在您的admin.py你將要添加的東西是這樣的:

class LocationGroupInline(admin.TabularInline): 
    model = LocationGroup 

class ReportAdmin(admin.ModelAdmin): 
    inlines = [ LocationGroupInline, ] 
admin.site.register(Report, ReportAdmin) 
admin.site.register(LocationGroup) 

有很多選擇,在LocationGroupInline包括,如果你想進一步配置相關模型的在線顯示。其中兩個選項是表單表單集,它可讓您使用自定義Django表單和FormSet類來進一步自定義內聯模型admin的外觀。使用這個,您可以創建一個簡單的窗體,只顯示您想要的多選域(除了一個M2M域,它不可能顯示爲一個下拉菜單,而是一個多選框)。例如:

class MyLocationGroupForm(forms.Form): 
    location = forms.MultipleModelChoiceField(
      queryset=LocationGroup.objects.all()) 

class LocationGroupInline(admin.TabularInline): 
    model = LocationGroup 
    form = MyLocationGroupForm 
+1

報告管理員將默認內聯LocationGroups,問題是怎麼做的相反。無論如何,這會引發LocationGroup沒有ForeignKey到ReportAdmin的異常。 – 2009-09-20 22:17:03

相關問題