【问题标题】:Display information about linked models fields in the django admin在 django admin 中显示有关链接模型字段的信息
【发布时间】:2021-10-27 11:10:02
【问题描述】:

这些是我的模型:

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)}

?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    我刚刚在 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))
    

    实现我想要的。

    如果我还想编辑这些多对多关系,我可以使用inlines option

    class LiveContractsInline(admin.TabularInline):
        model = ResearchActivity.partner.through
    
    @admin.register(ActivityPartner)
    class ActivityPartnerAdmin(admin.ModelAdmin):
    
        inlines = [
            LiveContractsInline,
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2011-03-07
      • 2020-02-14
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多