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

Posted

技术标签:

【中文标题】Django Admin - 表格内联外键字段列表的动态值【英文标题】:Django Admin - Dynamic value for a list of tabular inline foreign key fields 【发布时间】:2012-10-19 00:50:34 【问题描述】:

我有三个模型:

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 的引用。

如果我有另一个类的实例列表

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】:

您可以使用 django.contrib.admin 中的 TabularInline 执行类似的操作。下面是一个例子。我在与 models.py 相同的 Django 应用程序('test_app')中创建了 admin.py,只是为了将管理站点的内容与模型代码分开。

### 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 类选项即可。

【讨论】:

我试过这个,但我不希望用户每次都通过下拉菜单选择所有 AnotherClass 实例,但它们都会出现,而不必选择它们,每次用户想要添加/更改 Foo 实例。我不得不说我不知道​​ 'unique_together' 属性,我认为它非常有用,但另一部分恐怕只用管理 Django 应用程序是不可能的。

以上是关于Django Admin - 表格内联外键字段列表的动态值的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin -> 更改字段顺序,包括内联字段

通过 Django Admin 中的内联显示编辑/添加外键对象

Django admin内联显示但外键有相反的关系

如何在 django admin change_form 中更改外键字段的顺序

django admin 在 save_model 方法中删除内联对象

如何使用 ajax 在 Django-admin 表格内联中读取/写入输入字段?