这些是我的模型:
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))
实现我想要的。
如果我也想编辑那些manymany关系,我可以使用inlines
选项:
class LiveContractsInline(admin.TabularInline):
model = ResearchActivity.partner.through
@admin.register(ActivityPartner)
class ActivityPartnerAdmin(admin.ModelAdmin):
inlines = [
LiveContractsInline,
]