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 相关文章推荐
wxPython学习之主框架实例
Sep 28 Python
Python实现分割文件及合并文件的方法
Jul 10 Python
python2.7的编码问题与解决方法
Oct 04 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
Mar 08 Python
Django基础知识 web框架的本质详解
Jul 18 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
python实现人机猜拳小游戏
Feb 03 Python
Python如何实现FTP功能
May 28 Python
浅析Python __name__ 是什么
Jul 07 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 31 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及Zend Engine的线程安全模型分析
2011/11/10 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
基于Vue实现拖拽效果
2018/04/27 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
重命名批处理python脚本
2013/04/05 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
小学生暑假家长评语
2014/04/17 职场文书
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python
Java tomcat手动配置servlet详解
2021/11/27 Java/Android
Python开发简易五子棋小游戏
2022/05/02 Python