微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 object_list 中获取特定字段例如名称而不是 pk 以呈现外键

如何解决在 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 举报,一经查实,本站将立刻删除。