Django高级编程之自定义Field实现多语言
作者:Pykk2019 发布时间:2022-04-30 23:52:36
标签:Django,Field,多语言
自定义数据库字段
扩展默认的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
效果图
可以看到,数据库字段自动生成了相应语言的字段
当用户语言切换到其他,可以自动适配实现多语言
来源:https://www.cnblogs.com/PyKK2019/p/11117488.html
0
投稿
猜你喜欢
- 一、什么是数组数组就是一组数据的集合,把一系列数据组织起来,形成一个可操作的整体。数组的每个实体都包含两项:键和值。二、声明数据在PHP中声
- 一、需求描述文本溢出省略,说实话这些年也实践过很多了,这次是针对富文本字符串,思量想去,也曾试图了解一些知名站点的实现方案,但结果不甚理想。
- Anaconda安装:anaconda官方下载地址https://www.anaconda.com/products/individual注
- 前言由于自己并不以Python语言为主,这里只是简单介绍一下Numpy库的使用提示:以下是本篇文章正文内容🧡Numpy库介绍numpy 库处
- Urllib1. Urllib.request.urlopen().read().decode()返回一个二进制的对象,对这个对象进行rea
- 在上篇文章给大家介绍过Django 多环境配置详解,感兴趣的朋友可以点击查阅,今天继续给大家介绍django 多环境配置的相关内容,本文重点
- 模块a.py 想用 b.py中公有数据 cntb的python文件#!/usr/bin/env python# coding:utf8fro
- Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select
- 写在前面这篇文章的诞生要感谢MIT 6.284课程。在其中一节课中,谈到了多线程的协同的一些问题,其中就涉及到了channel这个概念,并由
- 我用 ip=Request.ServerVariables ("
- 在机器上首次安装MySQL,操作系统是win7mysql 的安装文件是 zip 格式的,版本是5.7.17解压之后,安装步骤是1、首先找个文
- 今天要处理通知书上的日期,写的一个处理程序,效率可能不是最优的,不过实现功能绝对没问题。注:月份和天要分>10,=10,<10三
- 前言最近在用python写一个项目,发现一个很恶心的bug,就是同由一个类生成的两个实例之间的数据竟然会相互影响,这让我非常不解。后来联想到
- 目录1 matplot入门指南2 安装与导入3 图的构成3 总结1 matplot入门指南matplotlib是Python科学计算中使用最
- 本文实例讲述了Python类的用法。分享给大家供大家参考。具体如下:先看一段代码:#!/usr/bin/env pythonclass Te
- 1、导入第三方库import urllib.request,urllib.error #请求网页from bs4 import
- CSS3 + HTML5是未来的Web,它们都还没有正式到来,虽然不少浏览器已经开始对它们提供部分支持。本文介绍了5个CSS3技巧,可以帮你
- <?php $fp = fopen("http://www.***.com/**
- 1.原生js操作domconst dom = getElementById(‘box')2.vue官方方法:refvue中的ref是
- 编写ATM程序实现下述功能,数据来源于文件db.txt1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改2、转账功能:用户A向