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 如下:

Cutout.Pro
Cutout.Pro

AI驱动的视觉设计平台

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

{% for each_order in get_order %}
   

{{ each_order.get_status_display }}

{% 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

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
什么是中间件
什么是中间件

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

178

2024.05.11

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

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

217

2025.12.18

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

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

320

2023.08.03

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

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

212

2023.09.04

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

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

1502

2023.10.24

字符串介绍
字符串介绍

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

625

2023.11.24

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

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

655

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

610

2024.04.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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