问题描述
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) 有没有一种更优雅的方式来以表格格式用我的属性来表示表单。 (我正在使用引导程序进行某些格式设置)
(2) 如果没有,我如何让外键字段显示 __str__
返回而不是 pk?
TemplateHelperClass
是多个模型的 MixIn,bookreview.html
的等效模板同样用于多个视图,因此如果可以避免,我不想在其中使用特定的字段名称以 DRY 为原则。
解决方法
简单的解决方案是使用自定义逻辑而不是field.value_to_string(...)
方法
class templateHelperClass():
paginate_by = 15
def get_fields(self):
return [(field,str(getattr(self,field.name))) 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
]