Как показать имя вместо id в django ForeignKey?
У меня есть модель с 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')
def __str__(self):
return self.name
А когда я хочу показать данные с помощью 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, что вернет нам связанный экземпляр 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()
Возвращается
[('ID', 1), ('name', 'Joe'), ('Very Important Name', <Person: Bob>)]
Теперь мы можем получить доступ ко всем атрибутам Bob
в шаблоне, если возникнет такая необходимость.