Отображение информации о связанных полях модели в админке django

Вот мои модели:

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:

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

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

    inlines = [
        LiveContractsInline,
    ]
Вернуться на верх