如何解决在 object_list 中获取特定字段例如名称而不是 pk 以呈现外键
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
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。