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简单的函数定义和用法实例
May 07 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
python如何读写csv数据
Mar 21 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
Apr 14 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处理excel cvs表格的方法实例介绍
2013/05/13 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
2013/11/20 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
angular2使用简单介绍
2016/03/01 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
javascript常用的设计模式
2017/02/09 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python中的面向对象编程详解(下)
2015/04/13 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
python绘制多个曲线的折线图
2020/03/23 Python
Python 占位符的使用方法详解
2019/07/10 Python
Python pandas如何向excel添加数据
2020/05/22 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
新店开张活动方案
2014/08/24 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript