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中的exec、eval使用实例
Sep 23 Python
Python制作数据导入导出工具
Jul 31 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
Python读取stdin方法实例
May 24 Python
python实现五子棋游戏
Jun 18 Python
python和c语言的主要区别总结
Jul 07 Python
python绘制随机网络图形示例
Nov 21 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
Python 解析库json及jsonpath pickle的实现
Aug 17 Python
如何用Python编写一个电子考勤系统
Feb 08 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采集时被封ip的解决方法
2010/08/29 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
ext 代码生成器
2009/08/07 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
[24:42]VP vs TNC Supermajor小组赛B组 BO3 第三场 6.2
2018/06/03 DOTA
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python多进程编程技术实例分析
2014/09/16 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
关于Python作用域自学总结
2019/06/10 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
2020/08/20 Python
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
临床护士自荐信
2014/01/31 职场文书
祖国在我心中演讲稿300字
2014/05/04 职场文书
工程资料员岗位职责
2015/04/13 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
Python开发简易五子棋小游戏
2022/05/02 Python