新行上的 Django 管理员内联更改字段

时间:2021-04-16 00:03:45

标签: django django-admin

背景

我正在为具有大量多对多关系和其他复杂数据的库存系统自定义管理页面。我想使用内联显示这些关系,但我不喜欢 Django 用于内联中多对多关系的默认下拉字段,因此我自定义了字段集。我的自定义字段比较简单,ID字段链接到相关记录,只读文本字段包含相关记录中的数据,因为Inline默认无法从相关记录中获取字段;那种东西。

问题

问题是为了在这些内联中使用自定义字段,我不得不将它们全部设为只读。通常这很好,因为您可以按照 ID 字段中的链接进入实际的编辑页面,但是不可能通过内联上的按钮添加新记录,因为我无法输入任何必要的信息。我的 ID 甚至不会自动递增,因为此数据需要与另一个数据库同步,因此新行不会链接到新创建的记录。

基本上,我想要做的是在新添加的行上有一组不同的可写字段,以便可以填写必填字段,例如 ID。

问题

我已经尝试通过重载 get_fields() 和 get_readonly_fields() 函数来做到这一点,但看起来这些确定了整个内联的字段,而不是单个行的字段。我什至不认为可以为多对多关系包含一个可写字段,因为内联实际上是显示来自中间模型的数据,而不是相关记录本身。

代码

这是我的一个简单内联的示例,让您更好地了解我在说什么:

class MetaDataInline(admin.TabularInline):
    verbose_name = 'meta data'
    verbose_name_plural = 'meta data'
    model = Product.meta_data.through
    fields = ('key', 'value')
    readonly_fields = ('key', 'value')
    extra = 0

    def key(self, obj): return obj.metadata.key
    def value(self, obj): return obj.metadata.value

以及新添加行的 Inline 截图:

Sorry, I can't embed yet

如您所见,我无法向父记录添加新元数据,因为新行显示为空白且无法使用。

结论

在我看来,这实际上是两个问题:

  1. 如何让 Inline 为新添加的行呈现不同的字段?

  2. 如何在多对多关系的内联中编辑相关数据?

我对回答这两个问题的任何帮助或对替代方法的建议将不胜感激。我知道将关系显示为水平过滤器而不是内联会给我提供我想要的功能,但我不喜欢它显示我的数据的方式,所以如果可能的话,我想让它像这样工作。

0 个答案:

没有答案
相关问题