如何为 Django models.IntegerChoices 添加标签

Nic*_*rss 5 python django django-templates django-models web-development-server

我的 django 模型之一中有两个 IntegerChoices 子类,它们定义 api 的票证优先级。我希望当优先级和状态在我的网页上呈现时显示标签,但是当使用 api 发送与标签相对应的整数时。到目前为止,这是我的代码:

class Ticket(models.Model):
    class Statuses(models.IntegerChoices):
        OPEN = 2, 'Open'
        PENDING = 3, 'Pending'
        RESOLVED = 4, 'Resolved'
        CLOSED = 5, 'Closed'
    class Priorities(models.IntegerChoices):
        LOW = 1, 'Low'
        MEDIUM = 2, 'Medium'
        HIGH = 3, 'High'
        URGENT = 4, 'Urgent'
    
    priority = models.IntegerField(default=Priorities.LOW, choices=Priorities.choices)
    status = models.IntegerField(default=Statuses.OPEN, choices=Statuses.choices)
Run Code Online (Sandbox Code Playgroud)

然后我尝试通过访问我的应用程序中的标签

<b>Priority: </b> {{ ticket.priority.label }} <br>
<b>Status:</b> {{ ticket.status.label }}
Run Code Online (Sandbox Code Playgroud)

但什么也没有出现。似乎新 IntegerChoices 类的 Django 文档非常少,并且不清楚标签函数如何工作。

我还尝试像这样渲染标签:

OPEN = 2, _('Open')
Run Code Online (Sandbox Code Playgroud)

但后来我收到一条错误消息“名称'_'未定义”

对于我需要做的事情有什么正确的指示吗?

更新

对于任何需要答案的人,我已经找到了。

我意识到渲染标签的错误是由于没有在模型开始时导入这一行:

from django.utils.translation import gettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

从那时起,为了从模板访问标签,我在票证模型中实现了 2 个 get 函数

def get_status(self):
    return self.Statuses(self.status).label
def get_priority(self):
    return self.Priorities(self.priority).label
Run Code Online (Sandbox Code Playgroud)

然后要在模板中获取它们,请执行以下操作:

<div>
{{ ticket.get_priority }}<br>
{{ ticket.get_status }}
</div>
Run Code Online (Sandbox Code Playgroud)

小智 11

无需添加获取标签的函数。使用该get_FOO_display方法效果很好。因此,在您的情况下,在模板上您将使用它{{ ticket.get_priority_display }}来获取“人类可读”值。请参阅文档