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 发送邮件实例代码
Dec 22 Python
Django如何实现内容缓存示例详解
Sep 24 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python进行两个表格对比的方法
Jun 27 Python
python list转矩阵的实例讲解
Aug 04 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
python logging模块的使用总结
Jul 09 Python
python tkinter组件摆放方式详解
Sep 16 Python
Python高级编程之继承问题详解(super与mro)
Nov 19 Python
Python中无限循环需要什么条件
May 27 Python
next在python中返回迭代器的实例方法
Dec 15 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缓存技术介绍
2006/11/25 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
2019/06/05 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python中的with...as用法介绍
2015/05/28 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
python实现求最长回文子串长度
2018/01/22 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
解读python logging模块的使用方法
2018/04/17 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
在python里从协程返回一个值的示例
2019/02/19 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
社团活动总结
2014/04/28 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
Go获取两个时区的时间差
2022/04/20 Golang