在 django 管理中显示有关链接模型字段的信息

Display information about linked models fields in the django admin

这些是我的模型:

class Partner(models.Model):

    name = models.CharField(max_length=200, verbose_name="Organisation name")

class ResearchActivity(models.Model):

    title = models.CharField(max_length=200)
    partner = models.ManyToManyField(ActivityPartner, blank=True)

我希望在 Django 管理表单中,在我的 Partner 编辑表单中有一个字段代表 ResearchActivity 链接到该合作伙伴。

是否可以通过向我的合作伙伴模型添加一个字段(例如,将其命名为 linked_partner)然后像这样编辑我的 admin.py 来实现:

@admin.register(ActivityPartner)
class ActivityPartnerAdmin(admin.ModelAdmin):
    search_fields = ['academic',]
    autocomplete_fields = ['partnership_type', 'relationship_type', 'academic_links']

    def get_changeform_initial_data(self, request):
        return {'live_contract': ResearchActivity.objects.all().filter(linked_partner__id=request.ResearchActivity.partner.id)}

?

我刚刚在 display() decorator 中遇到,是 Django 3.2 的新功能。有了它,我可以简单地做到:

@admin.register(ActivityPartner)
class ActivityPartnerAdmin(admin.ModelAdmin):
    search_fields = ['academic',]
    autocomplete_fields = ['partnership_type', 'relationship_type', 'academic_links',]

    readonly_fields = ('get_ra',)

    @admin.display(description='Live contract(s)')
    def get_ra(self, obj):
        return list(ResearchActivity.objects.filter(partner=obj.id))

实现我想要的。

如果我还想编辑那些 ManyToMany 关系,我可以使用 inlines option:

class LiveContractsInline(admin.TabularInline):
    model = ResearchActivity.partner.through

@admin.register(ActivityPartner)
class ActivityPartnerAdmin(admin.ModelAdmin):

    inlines = [
        LiveContractsInline,
    ]