Django中Lazy translation(懒翻译)的适用场景及使用规范
Django 懒翻译适用场景与核心逻辑
先搞懂懒翻译的判断准则
懒翻译相关函数不会立刻执行翻译,只会存一个字符串的懒引用,等字符串真的被用到渲染场景(比如模板输出、接口返回展示文本)时,才会根据当前激活的语言环境完成实际翻译。
只要翻译代码会在模块加载阶段就被执行,就必须用懒翻译。
Django里的Model、Form、ModelForm是这类场景的重灾区——这些组件的字段都是类级别属性,类定义本身会在模块导入的时候就被执行,这时候项目的请求上下文还没建立,根本拿不到用户的语言偏好,要是直接用普通的gettext(也就是常见的_()别名)做翻译,翻译结果会直接被固定成默认语言,后续用户切换语言也不会变,多语言就完全失效了。
模型选项的懒翻译适用边界
官方要求verbose_name、help_text必须用懒翻译,核心原因很简单:这两个值是给终端用户看的展示文本,会在Admin后台、表单渲染、接口提示等多个场景动态调用,不是代码里写死的内部标识,用懒翻译才能保证每次渲染时都匹配当前请求的语言。
很多人会纠结related_name、through这类其他模型选项要不要加懒翻译,答案是完全不需要:
related_name是ORM反向关联的属性名,属于代码层面的固定查询key,根本不会展示给用户,本身就不需要翻译through是多对多关联指定中间表的引用参数,纯内部逻辑使用,和用户展示没有任何关系,自然不需要做翻译处理
类级别属性用懒翻译的核心意义
本质上就是解决「类定义执行时机太早,翻译环境还没准备好」的时序问题:
模块导入阶段Django还没跑语言选择的中间件,既拿不到用户cookie里的语言偏好,也没加载完所有翻译目录,这时候执行普通翻译函数得到的结果一定是错的。懒翻译相当于把翻译动作推迟到了真正要展示文本的时刻,这时候请求上下文已经完整,语言环境已经激活,才能输出正确语言的文本。
代码示例说明
下面是符合规范的写法参考:
from django.utils.translation import gettext_lazy as _ class Course(models.Model): def __str__(self): return self.title title = models.CharField(max_length=200) # 位置参数实际是给verbose_name传值,必须用懒翻译包裹 pub_date = models.DateTimeField(_('date published')) # through是内部关联参数,不需要翻译 subscribers = models.ManyToManyField(User, through='Subscription') class MyThing(models.Model): kind = models.ForeignKey( ThingKind, on_delete=models.CASCADE, # related_name是内部查询用的属性名,不需要翻译 related_name='kinds', # 用户可见的verbose_name必须用懒翻译 verbose_name=_('kind'), )
必须用懒翻译的常见场景清单
- 模型字段、模型Meta类里所有面向用户展示的文本配置(verbose_name、help_text、verbose_name_plural等)
- Form、ModelForm字段的label、help_text、默认错误提示文本
- 任何写在模块顶层、类定义顶层,不会被立刻执行,后续才会在请求上下文中展示给用户的文本
内容的提问来源于stack exchange,提问作者BlueJupiter
相关产品推荐
相关产品推荐

