Отображение информации о связанных полях модели в админке 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,
]