使用django-modeltranslation无法获取Tag模型原始name字段求助
解决django-modeltranslation无法访问原始name字段的问题
这个问题其实是django-modeltranslation的核心工作机制导致的:它会把你定义的原始name字段包装成一个虚拟属性,访问它时会自动返回当前激活语言对应的翻译字段值(比如name_en、name_fr),如果该语言的翻译字段为空,就会返回空字符串——哪怕你的原始name字段里有实际值。从你的__dict__输出能看到,原始name确实存了'Sport',但直接访问tag.name时,因为当前激活语言是en,而name_en为None,所以返回空。
下面是几种解决方法,按需选择:
1. 直接访问原始字段的专用属性
modeltranslation为每个翻译字段自动生成了original_<fieldname>属性,你可以通过这个属性直接获取原始字段的值:
In [10]: Tag.objects.first().original_name Out[10]: u'Sport'
2. 在查询时绕过包装,直接读取原始字段
如果需要在数据库查询阶段就获取原始字段值,可以用values()或only()方法直接指定原始字段,避开modeltranslation的属性包装:
# 使用values()获取字典形式的结果 Tag.objects.values('id', 'name').first()['name'] # 返回 u'Sport' # 使用only()获取模型实例,结合original_属性读取 tag = Tag.objects.only('id', 'name').first() tag.original_name # 推荐这种更规范的方式
3. 配置回退规则,让空翻译自动使用原始字段
如果你希望当某个语言的翻译为空时,自动回退到原始字段的值,可以通过两种方式配置:
方式一:在TranslationOptions中设置字段级回退
修改translation.py里的配置:
from modeltranslation.translator import register, TranslationOptions from tags.models import Tag @register(Tag) class TagsTranslationOptions(TranslationOptions): fields = ('name',) # 当对应语言的翻译未定义时,回退到原始字段 fallback_undefined = {'name': None}
方式二:在settings中设置全局回退规则
在settings.py里添加modeltranslation的全局配置:
MODELTRANSLATION_ENABLE_FALLBACKS = True MODELTRANSLATION_FALLBACK_LANGUAGES = { 'default': ('en',), # 默认先回退到en语言,若en也为空则用原始字段 # 可针对特定语言单独设置回退链,比如: # 'fr': ('en',), }
这样配置后,当当前激活语言的翻译字段为空时,会自动按回退链查找,最终回退到原始字段值。
解决后台管理的显示问题
后台的问题和终端逻辑一致:默认显示当前语言的翻译字段(为空)。你可以:
- 用上述回退配置,让后台在翻译为空时自动显示原始字段值;
- 或者自定义Admin类,把原始
name和各个翻译字段一起展示:
# admin.py from django.contrib import admin from modeltranslation.admin import TranslationAdmin from .models import Tag class TagAdmin(TranslationAdmin): # 显式指定要显示的字段 list_display = ('name', 'name_en', 'name_fr', 'name_es', 'name_de') admin.site.register(Tag, TagAdmin)
内容的提问来源于stack exchange,提问作者Milano
相关产品推荐
相关产品推荐

