Django高级编程之自定义Field实现多语言


Posted in Python onJuly 02, 2019

自定义数据库字段

扩展默认的models.CharField和models.TextField使之成为支持多语言的字段。
可以轻松实现复用,无需配置多余选项

from django.conf import settings
from django.db import models
from django.utils.translation import get_language


class MultilingualField(models.Field):
 SUPPORTED_FIELD_TYPES = [models.CharField, models.TextField]

 def __init__(self, verbose_name=None, **kwargs):
  self.localized_field_model = None
  for model in MultilingualField.SUPPORTED_FIELD_TYPES:
   if issubclass(self.__class__, model):
    self.localized_field_model = model
  self._blank = kwargs.get("blank", False)
  self._editable = kwargs.get("editable", True)
  super().__init__(verbose_name, **kwargs)

 @staticmethod
 def localized_field_name(name, lang_code):
  lang_code_safe = lang_code.replace("-", "_")
  return f"{name}_{lang_code_safe}"

 def get_localized_field(self, lang_code, lang_name):
  _blank = (self._blank
     if lang_code == settings.LANGUAGE_CODE
     else True)
  localized_field = self.localized_field_model(
   f"{self.verbose_name} ({lang_name})",
   name=self.name,
   primary_key=self.primary_key,
   max_length=self.max_length,
   unique=self.unique,
   blank=_blank,
   null=False, # we ignore the null argument!
   db_index=self.db_index,
   default=self.default or "",
   editable=self._editable,
   serialize=self.serialize,
   choices=self.choices,
   help_text=self.help_text,
   db_column=None,
   db_tablespace=self.db_tablespace)
  return localized_field

 def contribute_to_class(self, cls, name,
       private_only=False):
  def translated_value(self):
   language = get_language()
   val = self.__dict__.get(
    MultilingualField.localized_field_name(
      name, language))
   if not val:
    val = self.__dict__.get(
     MultilingualField.localized_field_name(
       name, settings.LANGUAGE_CODE))
   return val

  # generate language-specific fields dynamically
  if not cls._meta.abstract:
   if self.localized_field_model:
    for lang_code, lang_name in settings.LANGUAGES:
     localized_field = self.get_localized_field(
      lang_code, lang_name)
     localized_field.contribute_to_class(
       cls,
       MultilingualField.localized_field_name(
         name, lang_code))

    setattr(cls, name, property(translated_value))
   else:
    super().contribute_to_class(
     cls, name, private_only)


class MultilingualCharField(models.CharField, MultilingualField):
 pass


class MultilingualTextField(models.TextField, MultilingualField):
 pass

这里定义了 MultilingualCharField 和 MultilingualTextField字段

使用方法

settings.py中配置多语言

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'

LANGUAGES = (
 ('en-us', 'US English'),
 ('zh-hans', 'Asia/Shanghai')
)

默认语言设置为中文,多语言为英语

models.py中使用字段

from django.db import models
from django.utils.translation import ugettext_lazy as _

from utils.fields import (
 MultilingualCharField,
 MultilingualTextField
)

class Item(models.Model):
 title = MultilingualCharField(_('Title'), max_length=200)
 description = MultilingualTextField(_('Description'), blank=True)
 content = MultilingualTextField(_('Content'))

 def __str__(self):
  return self.title

效果图

Django高级编程之自定义Field实现多语言

可以看到,数据库字段自动生成了相应语言的字段

当用户语言切换到其他,可以自动适配实现多语言

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的__init__ 、__new__、__call__小结
Apr 25 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
对python制作自己的数据集实例讲解
Dec 12 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
python 限制函数执行时间,自己实现timeout的实例
Jan 12 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
flask项目集成swagger的方法
Dec 09 Python
python 模拟登录B站的示例代码
Dec 15 Python
python 杀死自身进程的实现方法
Jul 01 #Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 #Python
PyCharm-错误-找不到指定文件python.exe的解决方法
Jul 01 #Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 #Python
简单了解python中对象的取反运算符
Jul 01 #Python
python做反被爬保护的方法
Jul 01 #Python
python全栈知识点总结
Jul 01 #Python
You might like
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php cookie 登录验证示例代码
2009/03/16 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php学习之function的用法
2012/07/14 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
jQuery 开天辟地入门篇一
2009/12/09 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
jQuery实现图片切换效果
2020/10/19 jQuery
Python 多线程的实例详解
2017/09/07 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
如何在pycharm中安装第三方包
2020/10/27 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
授权委托书公证
2014/09/14 职场文书
《打电话》教学反思
2016/02/22 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
app场景下uniapp的扫码记录
2022/07/23 Java/Android