【问题标题】:Issue outputting queryset results and <a> elements in Django admin在 Django admin 中输出查询集结果和 <a> 元素的问题
【发布时间】: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


    【解决方案1】:

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

    @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 对学者进行分组,尽管我似乎不知道怎么做。如果我将查询集更改为ResearchActivity.objects.filter(partner=obj.id),然后访问ac.academic,我没有任何输入。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2014-01-24
      • 2020-04-19
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多