Проблема вывода HTML в админку Django
У меня есть эти модели:
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):
.
Более того, если я пытаюсь создать гиперссылку (см. код выше), админ выводит '-' и ничего больше. Что я упускаю?
Вот fianl-решение, которого мне удалось достичь:
@admin.display(description='Академическая ссылка(и)') 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, но не могу понять, как это сделать. Если я изменяю queryset на ResearchActivity.objects.filter(partner=obj.id)
, а затем обращаюсь к ac.academic
, у меня нет никакого ввода.