0

0

Django中模型Choices字段的动态翻译实践指南

花韻仙語

花韻仙語

发布时间:2025-09-24 11:05:15

|

250人浏览过

|

来源于php中文网

原创

Django中模型Choices字段的动态翻译实践指南

本文详细介绍了如何在Django项目中,高效地翻译模型Choices字段的动态值。通过利用TextChoices枚举类型和gettext_lazy进行定义,结合模板中的get_FOO_display方法,可以确保模型字段的选项值在多语言环境下得到正确且自动的翻译,从而解决直接在模板中翻译动态变量的挑战。

在构建支持多语言的django网站时,经常会遇到需要翻译模型中charfield或integerfield字段的choices选项值的情况。直接在模板中使用{% blocktranslate %}{{ variable }}{% endblocktranslate %}来翻译动态变量(如each_order.status)往往无法达到预期效果,因为blocktranslate期望的是静态字符串或已标记为可翻译的字符串。django为此提供了更为优雅和推荐的解决方案,即结合使用textchoices、gettext_lazy和get_foo_display方法。

核心问题分析

当模型字段定义了choices选项时,例如:

class Order_product(models.Model):
    # ...
    status = models.CharField(max_length = 255, choices = [('Pending', 'Pending'), ('Need-Delivery', 'Need-Delivery'), ...])

在模板中直接显示{{ each_order.status }}会输出原始的英文值(如'Pending')。如果尝试用blocktranslate包裹它,Django的makemessages工具可能会生成一个包含%(each_order.status)s的msgid,这表明它将变量视为一个插值,而不是一个可以直接翻译的字符串,导致翻译失效。

解决方案:TextChoices 与 get_FOO_display

Django 3.0及更高版本推荐使用TextChoices(或IntegerChoices)来定义模型字段的选项。这种方式不仅使代码更具可读性,还与Django的国际化(i18n)功能更好地集成。

1. 定义可翻译的Choices

首先,我们需要在模型中定义可翻译的choices。这通过django.utils.translation.gettext_lazy(通常别名为_)来实现。gettext_lazy会延迟翻译字符串,直到它们被实际使用时,这对于模型定义非常重要,因为它避免了在应用启动时就加载所有翻译。

修改 models.py 如下:

from django.db import models
from django.utils.translation import gettext_lazy as _

class OrderStatus(models.TextChoices):
    PENDING = "Pending", _("Pending")
    NEED_DELIVERY = "Need-Delivery", _("Need-Delivery")
    DELIVERY = "Delivery", _("Delivery")
    SUCCESS = "Success", _("Success")
    RETURN_ORDER = "Return-Order", _("Return-Order")
    CANCEL = "Cancel", _("Cancel")

class Order_product(models.Model):
    name = models.CharField(max_length=255)
    note = models.TextField()
    status = models.CharField(
        max_length=255,
        choices=OrderStatus.choices,
        default=OrderStatus.PENDING # 可以设置默认值
    )

    def __str__(self):
        return f"{self.name} - {self.get_status_display()}"

在上述代码中:

  • 我们创建了一个OrderStatus枚举类,它继承自models.TextChoices。
  • 每个枚举成员的第二个元素都通过_()函数包裹,将其标记为可翻译字符串。
  • Order_product模型中的status字段现在使用OrderStatus.choices作为其选项。

2. 在模板中显示翻译后的值

Django模型实例提供了一个便捷的方法来获取choices字段的“人类可读”表示,这个方法命名约定是get_FOO_display,其中FOO是字段的名称。例如,对于status字段,这个方法就是get_status_display()。这个方法会自动返回当前活动语言环境下的翻译值。

修改 test.html 如下:

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载
{% load i18n %} {# 确保加载i18n标签 #}

{% for each_order in get_order %}
   <p>
       {{ each_order.get_status_display }}
   </p>
{% endfor %}

注意,这里不再需要{% blocktranslate %}标签,因为get_status_display方法本身就负责返回已翻译的字符串。

3. 视图层保持不变

views.py 中的逻辑无需改变,因为它只是简单地获取模型实例并传递给模板:

from django.shortcuts import render
from .models import Order_product # 导入具体的模型

def test(request):
    get_order = Order_product.objects.all()
    return render(request, 'test/test.html', {'get_order': get_order})

4. 生成和编译翻译文件

完成上述修改后,需要更新Django的翻译文件:

  1. 生成翻译消息文件: 运行以下命令来扫描项目中的可翻译字符串,并更新.po文件:
    python manage.py makemessages -l vi # 替换'vi'为你的目标语言代码

    执行此命令后,在locale/vi/LC_MESSAGES/django.po文件中,你会找到类似这样的条目:

    msgid "Pending"
    msgstr ""
  2. 添加翻译: 打开django.po文件,为msgid对应的字符串添加msgstr翻译。例如:
    msgid "Pending"
    msgstr "待处理" # 越南语可能是 "Đang chờ" 或其他
    msgid "Success"
    msgstr "成功" # 越南语可能是 "Thành công"
  3. 编译翻译文件: 保存django.po文件后,运行以下命令编译翻译文件,使其生效:
    python manage.py compilemessages

5. 配置语言切换中间件

确保你的settings.py中包含了LocaleMiddleware,它是处理语言切换的关键:

# settings.py
MIDDLEWARE = [
    # ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware', # 确保在 SessionMiddleware 之后,CommonMiddleware 之前
    'django.middleware.common.CommonMiddleware',
    # ...
]

# 定义支持的语言
LANGUAGES = [
    ('en', _('English')),
    ('vi', _('Vietnamese')),
    # ... 其他语言
]

# 定义翻译文件查找路径
LOCALE_PATHS = [
    BASE_DIR / 'locale',
]

注意事项与总结

  • TextChoices的优势: TextChoices不仅提供了更好的代码组织和可读性,还与Django的国际化系统无缝集成,是定义模型选项的推荐方式。
  • gettext_lazy的重要性: 使用gettext_lazy而不是gettext(或_()的直接调用)来标记choices字符串,可以避免在应用启动时过早地进行翻译,这在某些情况下是必要的。
  • get_FOO_display方法: 这是获取choices字段翻译值的标准方法,它会自动处理当前语言环境,无需手动在模板中进行翻译。
  • 翻译流程: 记住makemessages -> 编辑.po -> compilemessages的完整流程,以确保所有翻译都已正确生成和加载。
  • LocaleMiddleware: 它是Django处理HTTP请求中语言偏好的核心组件,必须正确配置。

通过采用TextChoices结合get_FOO_display的方法,Django开发者可以高效且优雅地实现模型choices字段的国际化,确保在多语言环境下用户能够看到正确翻译的选项值。这种方法避免了在模板中直接处理动态翻译的复杂性,使代码更加清晰和易于维护。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

169

2026.02.04

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

184

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1269

2024.03.22

c++ 字符处理
c++ 字符处理

本专题整合了c++字符处理教程、字符串处理函数相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号