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 相关文章推荐
Python2.x中文乱码问题解决方法
Jun 02 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
python编写分类决策树的代码
Dec 21 Python
opencv python 图像去噪的实现方法
Aug 31 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
Python闭包和装饰器用法实例详解
May 22 Python
Python3简单实现串口通信的方法
Jun 12 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
Python socket处理client连接过程解析
Mar 18 Python
基于Django快速集成Echarts代码示例
Dec 01 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
第四节--构造函数和析构函数
2006/11/16 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
DOM 基本方法
2009/07/18 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
Python的垃圾回收机制深入分析
2014/07/16 Python
python自动化测试实例解析
2014/09/28 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
详解Python 切片语法
2019/06/10 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python计算无向图节点度的实例代码
2019/11/22 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
如何给HTML标签中的文本设置修饰线
2019/11/18 HTML / CSS
如何提高MySql的安全性
2014/06/19 面试题
建筑设计师岗位职责
2013/11/18 职场文书
美德少年事迹材料
2014/01/23 职场文书
学校三节实施方案
2014/06/09 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
nginx location中多个if里面proxy_pass的方法
2021/03/31 Servers
python Tkinter的简单入门教程
2021/04/11 Python