在 Django 管理中发出输出查询集结果和 <a> 元素

Issue outputting queryset results and <a> elements in Django admin

我有这些型号:

class Academic(models.Model):

    surname = models.CharField(max_length=100, blank=True)
    forename = models.CharField(max_length=100, blank=True)

    def __str__(self):
        return '{}, {}'.format(self.surname, self.forename)

class Partner(models.Model):

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

class ResearchActivity(models.Model):

    title = models.CharField(max_length=200)
    academic = models.ManyToManyField(Academic, blank=True)
    partner = models.ManyToManyField(Partner, blank=True)

我想输出通过 ResearchActivity 模型链接到合作伙伴的学者。我的 admin.py:

中有这个装饰器
@admin.register(Partner)
class PartnerAdmin(admin.ModelAdmin):

    readonly_fields = ('get_academic_links',)

    @admin.display(description='Academic link(s)')
    def get_academic_links(self, obj):
       
        for ac in ResearchActivity.objects.filter(partner=obj.id).values_list('academic', flat=True).distinct():
            return mark_safe('<a href={}>' + ac.surname + '</a>', ac)

有点效果。如果我 return 只有 ac 那么我得到那个学者的 ID。根据 def __str__(self): 装饰器,我希望得到 'name, surname'。

更重要的是,如果我尝试构建一个超链接(参见上面的代码),管理员会输出一个“-”,而不是其他任何内容。我错过了什么?

更新

此代码:

        academics_set = list(ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct())
       return academics_set

returns


[('forename1', 'surname1'), ('forename2', 'surname2'), ('forename3', 'surname3')]

虽然这段代码:

        academics_set = list(ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct())
        for ac in academics_set:
            return ac

只有 return 是该列表的第一个元素:

('forename1', 'surname1')

我不明白为什么。

部分解

部分解决方案,输出所有三个名称,尽管是原始格式:

        academics_set = ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct()
        html = []
        for ac in academics_set:
             html.append("%s %s" % (ac[0], ac[1]))
        return mark_safe(html)

这输出:

['person1', 'person2', 'person3']

我要输出:

<a href="/admin/academic/academic_1_id/change">academic name 1</a>, <a href="/admin/academic/academic_2_id/change">academic name 2</a>, <a href="/admin/academic/academic_3_id/change">academic name 3</a>

这是我设法实现的最终解决方案:

@admin.display(说明='Academic link(s)') def get_academic_links(self, obj):

return format_html_join(
    ', ',
    mark_safe("<a href='/admin/artsdb/academic/{}/change/' target='_blank'>{} {}</a>"),
    ((ac['academic__id'], ac['academic__forename'], ac['academic__surname']) for ac in ResearchActivity.objects.filter(partner=obj.id).values('academic__forename', 'academic__surname', 'academic__id').distinct())
    )

我最终想按 ResearchActivity 对学术界进行分组,尽管我似乎不知道如何进行。如果我将查询集更改为 ResearchActivity.objects.filter(partner=obj.id) 然后访问 ac.academic,我没有任何输入。