如何在 Wagtail 管理中为模型字段添加外键 object 前缀?

How to prefix a foreign key object to a model field in Wagtail admin?

在这种情况下,每个功能 都有一个 史诗 (models.Model)

epic = models.ForeignKey(Epic, on_delete=models.CASCADE, default='')

在管理员 drop-down(而且只有那里)我想将每个项目显示为:

epic.name - feature.name

因为我的一些功能名称相似但不同epics。我不能更改Feature模型的__str__函数,否则会影响整个应用。

我怎样才能做到这一点?

一种方法是继承 Django 的 ModelChoiceField, and override the label_from_instance 提供标签的方法:

from django.forms import ModelChoiceField

class FeatureChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "%s - %s" % (obj.epic.name, obj.name)

然后您需要customise the edit form使用该自定义表单字段类型代替默认的 ModelChoiceField:

from wagtail.admin.forms import WagtailAdminModelForm
# note - use WagtailAdminPageForm if this is a page model rather than a
# plain Django model managed through snippets / ModelAdmin

class ScopeForm(WagtailAdminModelForm):
    feature = FeatureChoiceField(queryset=Feature.objects.all())


class Scope(models.Model):
    # ...

    base_form_class = ScopeForm