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 23 Python
pytyon 带有重复的全排列
Aug 13 Python
python实现2048小游戏
Mar 30 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
Python实现爬虫从网络上下载文档的实例代码
Jun 13 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
Python计算公交发车时间的完整代码
Feb 12 Python
python代码实现扫码关注公众号登录的实战
Nov 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
php基于curl扩展制作跨平台的restfule 接口
2015/05/11 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
PHPStorm2020.1永久激活及下载更新至2020(推荐)
2020/09/25 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
页面get请求 中文参数方法乱码问题的快速解决方法
2016/05/31 Javascript
Google 爬虫如何抓取 JavaScript 的内容
2017/04/07 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
python计算两个地址之间的距离方法
2018/06/09 Python
django2.0扩展用户字段示例
2019/02/13 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
Python实现区域填充的示例代码
2021/02/03 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
学生会干部自荐信
2014/02/04 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
应聘教师求职信
2014/07/19 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
检讨书1000字
2014/10/11 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
关于JavaScript回调函数的深入理解
2021/06/27 Javascript
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers