2012-10-29 90 views
3

列表動態值我有三個型號:Django管理 - 對錶格內聯外鍵的字段

class Foo (models.Model): 
    date = models.DateField(default = date.today) 

class Bar (models.Model): 
    foo = models.ForeignKey(Foo) 
    another = models.ForeignKey(AnotherClass) #this class is important 
    amount = models.IntegerField(default=0) 

class AnotherClass (models.Model): 
    name = models.CharField() 

現在我想以表格方式在線添加美孚+酒吧的/變化的情況。關鍵是每個Bar實例都是一定量AnotherClass實例的引用,並且每個Foo實例都必須引用系統中的所有AnotherClass。

所以,如果我有AnotherClass的實例列表

AnotherClass1 
AnotherClass2 
AnotherClass3 
AnotherClass4 

foo的添加/更改管理頁面應該是這樣的

Add Foo! 
-------------------------------------------- 

date = (datePicker) 

Pretty Bar TabularInline 
-------------------------------------------- 
AnotherClass1.name  amount = intPicker 
AnotherClass2.name  amount = intPicker 
AnotherClass3.name  amount = intPicker 
AnotherClass4.name  amount = intPicker 

其中AnotherClassX.name不可編輯,只顯示AnotherClass實例的名稱。

有沒有簡單的方法來做到這一點?

回答

0

您可以使用django.contrib.admin中的TabularInline做類似的事情。下面是一個例子。我在models.py的同一個Django應用程序('test_app')中創建了admin.py,只是爲了讓Admin站點的東西與模型代碼分離。

### models.py ### 
from django.db import models 
from datetime import date 

class Foo (models.Model): 
    date = models.DateField(default = date.today) 

class AnotherClass (models.Model): 
    name = models.CharField(max_length=128) 

    def __unicode__(self): 
     return u'%s' % (self.name) 

class Bar (models.Model): 
    foo = models.ForeignKey(Foo) 
    another = models.ForeignKey(AnotherClass) #this class is important 
    amount = models.IntegerField(default=0) 

    class Meta: 
     unique_together = (('foo', 'another'),) 

### admin.py ### 
from test_app.models import Foo, Bar, AnotherClass 
from django.contrib import admin 

class BarsInline(admin.TabularInline): 
    model = Bar 

class FooAdmin(admin.ModelAdmin): 
    inlines = (BarsInline,) 

admin.site.register(Foo, FooAdmin) 
admin.site.register(Bar) 
admin.site.register(AnotherClass) 

這將添加在創建或編輯Foo實例時添加或修改多個Bar關係的功能。請注意,AnotherClass選項是下拉菜單,但AnotherClass.name字段不可編輯。

需要注意的一個問題是,您所描述的模型架構允許多次將相同的AnotherClass實例與Foo(通過Bar)關聯。這可能是也可能不是你想要的。爲了防止AnotherClass實例和Foo實例之間的多重關係,請在Bar模型中使用Meta選項'unique_together',該模型在上面的示例代碼中使用。如果你想允許這種行爲,只需刪除這個元類選項。

+0

我試過這個,但我不希望用戶每次都通過下拉菜單選擇所有AnotherClass實例,但它們全都出現,無需選擇它們,每當用戶想要添加/更改Foo實例。我不得不說,我不知道'unique_together'屬性,我認爲它非常有用,但我擔心的另一部分是隻能用管理Django應用程序才能做到的。 – Daniel