You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用gettext翻译Django模型字段中携带变量的help_text?

Django模型help_text带变量的多语言翻译解决方案

问题根因

原写法直接对ugettext_lazy返回的惰性翻译对象使用%格式化运算符,会在Django项目启动时直接触发翻译求值,生成固定语言的字符串,后续用户切换语言时无法动态更新,最终导致翻译失效。

正确实现方案

1. 导入依赖

在models.py头部新增format_lazy导入,Django 3.0+版本推荐替换废弃的ugettext_lazy为gettext_lazy:

from django.conf import settings
from django.db import models
from django.utils.text import format_lazy
from django.utils.translation import gettext_lazy as _

2. 修改字段help_text定义

使用format_lazy包裹翻译字符串和变量,保留翻译的惰性求值特性:

class MyModel(models.Model):
    name = models.CharField(help_text=format_lazy(_("Name cannot contain %s"), settings.SPECIAL_CHARS))
    # 也支持format风格占位符:
    # name = models.CharField(help_text=format_lazy(_("Name cannot contain {}"), settings.SPECIAL_CHARS))

3. 翻译文件配置

django.po文件不需要修改,保持原有msgid即可,提取翻译时会正常识别带占位符的字符串:

msgid "Name cannot contain %s"
msgstr "名称不能包含 %s"

4. 生效验证

修改完成后执行命令重新生成并编译翻译文件:

# 提取翻译字符串,替换zh_Hans为你对应的语言码
django-admin makemessages -l zh_Hans
# 编译翻译文件
django-admin compilemessages

重启Django服务后即可验证多语言切换效果。

注意事项

  • 原代码中字段类名CharFiled拼写错误,正确应为CharField,否则会触发导入错误。
  • 不要直接对惰性翻译对象使用%、format等会触发立即求值的操作,所有需要动态拼接变量的场景都使用format_lazy处理。

内容的提问来源于stack exchange,提问作者ly2375

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:15:05