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 struct.unpack
Sep 06 Python
python使用rsa加密算法模块模拟新浪微博登录
Jan 22 Python
python中黄金分割法实现方法
May 06 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python正规则表达式学习指南
Aug 02 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
python实现学员管理系统
Feb 26 Python
django中瀑布流写法实例代码
Oct 14 Python
django中cookiecutter的使用教程
Dec 03 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
js获取域名的方法
2015/01/27 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
ECMAScript6--解构
2017/03/30 Javascript
JS设置手机验证码60s等待实现代码
2017/06/14 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
python实现跨文件全局变量的方法
2014/07/07 Python
Python中字典的基础知识归纳小结
2015/08/19 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
详解Python核心对象类型字符串
2018/02/11 Python
Django如何配置mysql数据库
2018/05/04 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
学校安全工作制度
2014/01/19 职场文书
党员大会主持词
2014/04/02 职场文书
实习单位指导教师评语
2014/12/30 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
政审证明范文
2015/06/19 职场文书