在 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
,我没有任何输入。
我有这些型号:
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
,我没有任何输入。