获取特定字段(例如名称)而不是 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
        ]