django-model-utils的StatusModel能提供可读的状态选项吗?

3 投票
1 回答
1713 浏览
提问于 2025-04-16 17:57

我正在尝试使用Carl Meyer的很棒的StatusModel功能,这个功能是django-model-utils这个包的一部分,目的是创建一个带有状态字段的模型。这种设计非常好,你只需要让你的模型继承自StatusModel,然后给模型中的一个叫做STATUS的字段传递一个Choices对象,这样就会自动在数据库中创建'状态'和'状态变化'这两个字段。

我希望我的状态字段在数据库中的表示和人类可读的值是分开的,而关于Choices类的文档提到,可以传递一个包含两个值的元组,第一个值是数据库中的表示,第二个值是人类可读的值。但是当我尝试用我的StatusModel和上面的Choices对象这样做时,在模板中使用状态字段时,仍然得到的是数据库中的表示。

这是我的模型类的一部分:

from django.utils.translation import ugettext as _
from model_utils import Choices
from model_utils.models import StatusModel

STATUS_CHOICES = Choices(
    ('awaiting_approval', _('Awaiting approval')), 
    ('returned_to_submitter', _('Returned to submitter')), 
    ('approved', _('Approved')), 
    ('denied', _('Denied')),
)

class Petition(StatusModel):
    STATUS = STATUS_CHOICES
    ...

这是我的模板:

<table>
    <tr>
        <th>Status</th>
    </tr>
    {% for petition in petitions %}
    <tr>
        <td>{{ petition.status }}</td> 
        <!-- expecting "Awaiting approval" but it displays "awaiting_approval" -->
    </tr>
    {% endfor %}
</table>

我该如何让模型类返回人类可读的状态呢?或者说StatusModel不支持Choices对象的这个功能吗?

1 个回答

6

你可以直接使用普通的 get_FOO_display() 方法。在这个例子中,就是 {{ petition.get_status_display }}

撰写回答