如何在 django ForeignKey 中显示名称而不是 id?

How to show name instad of id in django ForeignKey?

我有一个自身带有外键的模型。

models.py

class Person(models.Model):
    name = models.CharField(max_length=20)
    important_name = models.ForeignKey('Person', on_delete=models.SET_NULL, blank=True, null=True, related_name='first', verbose_name='Very Important Name')

    def __str__(self):
        return self.name

    def get_fields(self):
        return [(field.verbose_name, field.value_from_object(self)) for field in self.__class__._meta.fields]

当我想用 DetailView CBV 显示我的数据时,它在视图中显示 ID 而不是名称。

views.py

class DetailPerson(DetailView):
    model = Person
    template_name = 'panel/detail_person.html'

detail_person.html

<table class="table">
    {% for label, value in object.get_fields %}
        <tr>
            <td>{{ label }}</td>
            <td>{{ value }}</td>
        </tr>
    {% endfor %}
</table>

如何显示名称而不是 ID?

在这里我们可以使用 getattr 而不是 value_from_object,这将 return 我们使用 Person 的相关实例而不是 ID。

    def get_fields(self):
        return [(field.verbose_name, getattr(self, field.name)) for field in self.__class__._meta.fields]

示例:

from base.models import Person
a = Person.objects.first()
a.get_fields()

Returns [('ID', 1), ('name', 'Joe'), ('Very Important Name', <Person: Bob>)]

现在,如果需要,我们也可以在模板中访问 Bob 的所有属性。