如何在 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
的所有属性。
我有一个自身带有外键的模型。
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
的所有属性。