如何修改Django模型类的字符串表示以适配多语言翻译需求
解决方案
你遇到的场景是Django内置逻辑调用了模型类的显示名称而非实例的字符串表示,可通过以下两种方式实现需求,完全适配本地化翻译规范:
方式一:配置模型Meta属性(推荐,覆盖99%内置场景)
Django所有官方组件(包括表单校验、Admin后台等)默认读取模型Meta类的verbose_name属性作为模型类的显示名称,搭配国际化翻译工具即可实现本地化,无需修改原始类名:
from django.db import models from django.utils.translation import gettext_lazy as _ class Company(models.Model): name = models.CharField(max_length=100) email = models.EmailField(unique=True) def __str__(self): return self.name class Meta: # 单数形式的模型显示名,会被自动用于你遇到的唯一性校验错误提示场景 verbose_name = _("公司") # 复数形式的模型显示名,用于多实例场景的提示 verbose_name_plural = _("公司")
配置后你遇到的重复邮箱校验错误,会自动将原提示中的Company替换为你翻译后的公司(若配置多语言会随用户语言环境自动切换)。
方式二:自定义模型类的字符串表示
若你确实需要修改直接打印模型类(如print(Company))时的输出内容,可通过自定义模型元类实现:
from django.db import models from django.db.models.base import ModelBase from django.utils.translation import gettext_lazy as _ class TranslatedModelNameMeta(ModelBase): def __str__(cls): return str(cls._meta.verbose_name) class Company(models.Model, metaclass=TranslatedModelNameMeta): name = models.CharField(max_length=100) email = models.EmailField(unique=True) def __str__(self): return self.name class Meta: verbose_name = _("公司") verbose_name_plural = _("公司")
该方式下直接执行print(Company)会输出公司而非默认的<class 'xxx.models.Company'>。
内容的提问来源于stack exchange,提问作者d1spstack
相关产品推荐
相关产品推荐

