【发布时间】:2021-12-12 20:28:47
【问题描述】:
我有这些模型:
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)
它有点工作。如果我只返回ac,那么我会得到那个学者的 ID。根据def __str__(self): 装饰器,我希望得到“姓名,姓氏”。
更重要的是,如果我尝试构建一个超链接(参见上面的代码),管理员会输出一个“-”而不是其他任何东西。我错过了什么?
更新
这段代码:
academics_set = list(ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct())
return academics_set
返回
[('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
只返回该列表的第一个元素:
('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>
【问题讨论】:
标签: django django-templates django-admin