#django #django-templates #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('lt;a href={}gt;' ac.surname 'lt;/agt;', ac)
Это вроде как работает. Если я вернусь только ac
тогда, я получу удостоверение личности этого академика. Я ожидал бы получить «имя, фамилию», согласно 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']
Я хотел бы вывести:
lt;a href="/admin/academic/academic_1_id/change"gt;academic name 1lt;/agt;, lt;a href="/admin/academic/academic_2_id/change"gt;academic name 2lt;/agt;, lt;a href="/admin/academic/academic_3_id/change"gt;academic name 3lt;/agt;
Ответ №1:
Это окончательное решение, которого мне удалось достичь:
@admin.display(описание=’Академическая ссылка(ы)’) для ссылок get_academic_links(self, obj):
return format_html_join( ', ', mark_safe("lt;a href='/admin/artsdb/academic/{}/change/' target='_blank'gt;{} {}lt;/agt;"), ((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.objects.filter(partner=obj.id)
и затем получу доступ ac.academic
, у меня не будет никаких входных данных.