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访问sqlserver示例
Feb 10 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
python多进程和多线程究竟谁更快(详解)
May 29 Python
python3.5基于TCP实现文件传输
Mar 20 Python
python实现微信小程序自动回复
Sep 10 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Python3远程监控程序的实现方法
Jul 15 Python
python通过http下载文件的方法详解
Jul 26 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
浅谈Python中的模块
Jun 10 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
mysq GBKl乱码
2006/11/28 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
vue实现通讯录功能
2018/07/14 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
Python闭包实现计数器的方法
2015/05/05 Python
Python线程指南详细介绍
2017/01/05 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
Python如何对齐字符串
2020/07/30 Python
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
学校办公室主任职责
2013/12/27 职场文书
迎八一活动主题
2014/01/31 职场文书
公司承诺书怎么写
2014/05/24 职场文书
商铺消防安全责任书
2014/07/29 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
委托培训协议书
2014/11/17 职场文书
党支部考察鉴定意见
2015/06/02 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
血轮眼轮回眼特效 html+css
2021/03/31 HTML / CSS
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript