Django Admin - 表格内联外键字段列表的动态值

时间:2012-10-29 16:55:01

标签: python django django-models django-templates django-admin

我有三种模式:

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()

现在我想以表格内联方式添加/更改Foo + Bar的实例。关键是每个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实例的名称。

有没有简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

你可以使用django.contrib.admin中的TabularInline做类似的事情。以下是一个例子。我在同一个Django应用程序('test_app')中创建了admin.py和models.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”,该选项在上面的示例代码中使用。如果要允许此行为,只需删除此Meta类选项。