django-tables2结合django-modeltranslation多语言字段显示异常求助
解决django-tables2与django-modeltranslation兼容问题
问题说明
在项目中使用django-tables2配合django-modeltranslation实现英/法双语本地化时,手动用HTML渲染表格能正常显示当前语言的内容,但django-tables2会渲染出所有带语言后缀的字段(如name_en、name_fr),完全忽略本地化设置。
问题根源
django-tables2的localize/unlocalize选项是用于字段格式本地化(比如日期、数字的区域格式),并非针对多语言字段的切换,和django-modeltranslation的字段生成逻辑不兼容。modeltranslation会为每个翻译字段动态生成带语言后缀的数据库字段,django-tables2默认会把这些后缀字段识别为普通字段,因此全部显示出来。
解决方案
手动指定表格列的取值逻辑,只获取当前语言对应的字段值,同时避免django-tables2自动加载所有生成的语言字段。
修改tables.py
from django.utils.translation import get_language from django_tables2 import tables from .models import DataSet class DataSetTable(tables.Table): # 通过accessor手动获取当前语言的字段值 name = tables.Column(accessor=lambda obj: getattr(obj, f"name_{get_language()}")) source = tables.Column(accessor=lambda obj: getattr(obj, f"source_{get_language()}")) data_type = tables.Column(accessor=lambda obj: getattr(obj, f"data_type_{get_language()}")) class Meta: model = DataSet # 明确指定要显示的列,防止自动加载所有语言后缀字段 fields = ("name", "source", "data_type") sequence = ("name", "source", "data_type") # 移除无用的localize/unlocalize配置
更优雅的写法(利用modeltranslation内置方法)
如果你的Model实例已经被modeltranslation注册,可以直接使用trans_attr方法:
name = tables.Column(accessor=lambda obj: obj.trans_attr('name')) source = tables.Column(accessor=lambda obj: obj.trans_attr('source')) data_type = tables.Column(accessor=lambda obj: obj.trans_attr('data_type'))
确保项目本地化配置正确
检查settings.py中的关键配置:
USE_I18N = True LANGUAGES = [ ('en', 'English'), ('fr', 'French'), ] LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), ]
内容的提问来源于stack exchange,提问作者jcuot
相关产品推荐
相关产品推荐

