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高效编程技巧
Jan 07 Python
python实现调用其他python脚本的方法
Oct 05 Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
python 连接sqlite及简单操作
Jun 30 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
Python实现简单的2048小游戏
Mar 01 Python
用python开发一款操作MySQL的小工具
May 12 Python
Python基础之条件语句详解
Jun 16 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
mysql时区问题
2008/03/26 PHP
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
Yii数据库缓存实例分析
2016/03/29 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
Python的条件语句与运算符优先级详解
2015/10/13 Python
python中根据字符串调用函数的实现方法
2016/06/12 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
python将字符串转换成json的方法小结
2019/07/09 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python检查目录文件权限并修改目录文件权限的操作
2020/03/11 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
优秀德育工作者事迹材料
2014/05/07 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
先进党组织事迹材料
2014/12/26 职场文书
财务稽核岗位职责
2015/04/13 职场文书
学校财务管理制度
2015/08/04 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
高中优秀作文(范文)
2019/08/15 职场文书