获取特定字段(例如名称)而不是 object_list 中的 pk 以呈现外键
Getting a specific field (e.g. name) instead of pk in object_list for rendering for a foreignkey
我有一个应用程序,例如:
class example(models.Model, TemplateHelperClass):
reviewer = CharField(max_length=255, verbose_name="Title")
book = ForeignKey(books, on_delete=models.PROTECT)
review = TextField()
...
class books(models.Model, TemplateHelperClass):
author = CharField(max_length=255, verbose_name="Author")
book_title = CharField(max_length=255, verbose_name="Title")
publisher = CharField(max_length=255, verbose_name="Author")
def __str__(self):
return self.book_title
...
class templateHelperClass():
paginate_by = 15
def get_fields(self):
return [(field, field.value_to_string(self)) for field in self._meta.fields]
*views.py*
class bookReviewList(ListView):
model = example
template_name = "bookreviews.html"
...
*bookreviews.html*
{% extends "base.html" %}
{% block content %}
<table class="table">
<thead>
<tr>
{% for fld, val in object_list.0.get_fields %}
<th>{{ fld.verbose_name |title }}</th>
{% endfor %}
<th></th>
</tr>
</thead>
<tbody>
{% for object in object_list %}
<tr>
{% for fl1, val1 in object.get_fields %}
<td>{{val1}}</td>
{% endfor %}
<td><a class="btn btn-dark" href='{{ object.get_absolute_url }}'>Update</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
输出 html 显示书的 pk,而不是本例中的书名(__str__
方法)。我想显示 __str__
方法。两个问题,都相关:
(1) 有没有更优雅的方式来表示带有我的 table 格式的属性的表单。 (我使用 bootstrap 进行一些格式化)
(2) 如果不是,我如何让外键字段显示 __str__
return 而不是 pk?
TemplateHelperClass
是多个模型的 MixIn,bookreview.html
的等效模板同样用于多个视图,所以我不想在任何一个中使用特定的字段名称,如果我可以按照DRY的原则避免。
简单的解决方案是使用自定义逻辑而不是 field.value_to_string(...)
方法
class templateHelperClass():
paginate_by = 15
def get_fields(self):
return [(field, <b>str(getattr(self, field.name))</b>) for field in self._meta.fields]
或者,
仅对 FK 字段使用自定义逻辑,如
class templateHelperClass:
paginate_by = 15
def get_fields(self):
return [
(field, str(getattr(self, field.name)))
if isinstance(field, models.ForeignKey)
else (field, field.value_to_string(self))
for field in self._meta.fields
]
我有一个应用程序,例如:
class example(models.Model, TemplateHelperClass):
reviewer = CharField(max_length=255, verbose_name="Title")
book = ForeignKey(books, on_delete=models.PROTECT)
review = TextField()
...
class books(models.Model, TemplateHelperClass):
author = CharField(max_length=255, verbose_name="Author")
book_title = CharField(max_length=255, verbose_name="Title")
publisher = CharField(max_length=255, verbose_name="Author")
def __str__(self):
return self.book_title
...
class templateHelperClass():
paginate_by = 15
def get_fields(self):
return [(field, field.value_to_string(self)) for field in self._meta.fields]
*views.py*
class bookReviewList(ListView):
model = example
template_name = "bookreviews.html"
...
*bookreviews.html*
{% extends "base.html" %}
{% block content %}
<table class="table">
<thead>
<tr>
{% for fld, val in object_list.0.get_fields %}
<th>{{ fld.verbose_name |title }}</th>
{% endfor %}
<th></th>
</tr>
</thead>
<tbody>
{% for object in object_list %}
<tr>
{% for fl1, val1 in object.get_fields %}
<td>{{val1}}</td>
{% endfor %}
<td><a class="btn btn-dark" href='{{ object.get_absolute_url }}'>Update</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
输出 html 显示书的 pk,而不是本例中的书名(__str__
方法)。我想显示 __str__
方法。两个问题,都相关:
(1) 有没有更优雅的方式来表示带有我的 table 格式的属性的表单。 (我使用 bootstrap 进行一些格式化)
(2) 如果不是,我如何让外键字段显示 __str__
return 而不是 pk?
TemplateHelperClass
是多个模型的 MixIn,bookreview.html
的等效模板同样用于多个视图,所以我不想在任何一个中使用特定的字段名称,如果我可以按照DRY的原则避免。
简单的解决方案是使用自定义逻辑而不是 field.value_to_string(...)
方法
class templateHelperClass():
paginate_by = 15
def get_fields(self):
return [(field, <b>str(getattr(self, field.name))</b>) for field in self._meta.fields]
或者, 仅对 FK 字段使用自定义逻辑,如
class templateHelperClass:
paginate_by = 15
def get_fields(self):
return [
(field, str(getattr(self, field.name)))
if isinstance(field, models.ForeignKey)
else (field, field.value_to_string(self))
for field in self._meta.fields
]