扩展默认的models.CharField和模型。TextField使之成为支持多语言的字段。
可以轻松实现复用,无需配置多余选项
django。配置导入设置 django。数据库导入模型 从django.utils。翻译进口get_language 类MultilingualField (models.Field): SUPPORTED_FIELD_TYPES=[模型。CharField models.TextField] def __init__(自我,verbose_name=None, * * kwargs): 自我。localized_field_model=没有 为在MultilingualField.SUPPORTED_FIELD_TYPES模型: 如果issubclass(自我。__class__进行模型): 自我。localized_field_model=模型 自我。平等自愿=kwargs。(“空白”,假) 自我。_editable=kwargs。(“可编辑”,真正的) 超级()。__init__ (verbose_name * * kwargs) @staticmethod lang_code def localized_field_name(名称): lang_code_safe=lang_code。替换(“-”、“_”) 返回f“{name} _ {lang_code_safe}” def get_localized_field(自我、lang_code lang_name): 平等自愿=(self._blank 如果lang_code==settings.LANGUAGE_CODE 其他真的) localized_field=self.localized_field_model ( f”{自我。verbose_name} ({lang_name})”, name=self.name, primary_key=self.primary_key, max_length=self.max_length,=self.unique独特, 空白=平等自愿, null=False, #我们忽略null参数! db_index=self.db_index, 默认=self.default或“”, 可编辑=self._editable,=self.serialize序列化, 选择=self.choices, help_text=self.help_text, db_column=没有 db_tablespace=self.db_tablespace) 返回localized_field def contribute_to_class(自我,cls,名字, private_only=False): def translated_value(自我): 语言=get_language () val=self.__dict__.get ( MultilingualField.localized_field_name ( 名称、语言)) 如果不是val: val=self.__dict__.get ( MultilingualField.localized_field_name ( 名字,settings.LANGUAGE_CODE)) 返回瓦尔 #动态生成特定于语言的领域 如果不是cls._meta.abstract: 如果self.localized_field_model: lang_code, lang_name settings.LANGUAGES: localized_field=self.get_localized_field ( lang_code lang_name) localized_field.contribute_to_class ( cls, MultilingualField.localized_field_name ( 名字,lang_code)) setattr (cls、名称、属性(translated_value)) 其他: 超级().contribute_to_class ( cls、名称、private_only) 类MultilingualCharField(模型。CharField MultilingualField): 通过 类MultilingualTextField(模型。文本框,MultilingualField): 通过
这里定义了MultilingualCharField和MultilingualTextField字段
<代码> settings.py> 代码中配置多语言
LANGUAGE_CODE=' zh-hans ' TIME_ZONE='亚洲/上海' 语言=( (“en - US”、“美国英语”), (“zh-hans”、“亚洲/上海”) )
默认语言设置为中文,多语言为英语
<代码> models.py> 代码中使用字段
django。数据库导入模型 从django.utils。翻译进口ugettext_lazy _ 从跑龙套。领域导入( MultilingualCharField, MultilingualTextField ) 类项目(models.Model): title=MultilingualCharField(_(“标题”),max_length=200) 描述=MultilingualTextField(_(描述),空白=True) 内容=MultilingualTextField(_(“内容”)) def __str__(自我): 返回self.title
效果图
可以看的到,数据库字段自动生成了相应语言的字段
当用户语言切换到其他,可以自动适配实现多语言
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。