如何在Django translated fields的字段标签中显示对应语言代码
Django translated fields 自动给后台翻译字段标签追加语言代码的通用方案
你之前手动为每个语言单独配置verbose_name的方式可以实现需求,但重复代码多、后续新增语言时维护成本高,可根据需求选择以下两种通用实现方案:
方案1:自定义翻译字段基类(全局生效)
继承官方TranslatedField重写初始化逻辑,自动为每个语言的字段追加语言代码后缀,所有使用该自定义字段的模型都会自动生效:
from django.utils.translation import gettext_lazy as _ from translated_fields import TranslatedField as BaseTranslatedField class TranslatedField(BaseTranslatedField): def __init__(self, *args, **kwargs): base_verbose_name = kwargs.pop('verbose_name', None) super().__init__(*args, **kwargs) # 遍历所有已配置的语言,自动生成带语言后缀的显示名 for lang_code, field_options in self.language_fields.items(): if base_verbose_name: field_options['verbose_name'] = f"{_(base_verbose_name)} ({lang_code})"
模型使用示例:
class YourFileModel(models.Model): # 只需配置基础显示名,不需要单独处理每个语言 file_title = TranslatedField( models.CharField(max_length=255), verbose_name=_('File Title') ) file_desc = TranslatedField( models.TextField(blank=True), verbose_name=_('File Description') )
方案2:自定义ModelAdmin基类(仅后台显示生效)
如果不需要修改字段全局的verbose_name,只需要在后台表单显示时追加语言代码,可通过重写Admin的表单生成逻辑实现:
from django.contrib import admin from django.conf import settings class TranslatedModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, change=False, **kwargs): form = super().get_form(request, obj, change, **kwargs) # 遍历所有表单字段,匹配翻译字段命名规则(字段名_语言代码) for field_name, field in form.base_fields.items(): for lang_code, _ in settings.LANGUAGES: lang_suffix = f"_{lang_code}" if field_name.endswith(lang_suffix): field.label = f"{field.label} ({lang_code})" break return form
使用时只需要让你的模型Admin继承该基类即可:
@admin.register(YourFileModel) class YourFileModelAdmin(TranslatedModelAdmin): # 其他Admin配置不变 list_display = ["id", "file_title"]
如果需要排除部分翻译字段不添加后缀,在上述逻辑中增加对应的字段名判断即可。
内容的提问来源于stack exchange,提问作者Erfan Saberi
相关产品推荐
相关产品推荐

