創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務(wù)器提供商,新人活動買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為民樂企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站設(shè)計,民樂網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。小編給大家分享一下Django自定義Field實現(xiàn)多語言的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Django高級編程之自定義Field實現(xiàn)多語言
自定義數(shù)據(jù)庫字段
擴(kuò)展默認(rèn)的models.CharField和models.TextField使之成為支持多語言的字段。可以輕松實現(xiàn)復(fù)用,無需配置多余選項。
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')
)默認(rèn)語言設(shè)置為中文,多語言為英語
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效果圖

可以看到,數(shù)據(jù)庫字段自動生成了相應(yīng)語言的字段,當(dāng)用戶語言切換到其他,可以自動適配實現(xiàn)多語言。
以上是Django自定義Field實現(xiàn)多語言的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
網(wǎng)頁標(biāo)題:Django自定義Field實現(xiàn)多語言的方法-創(chuàng)新互聯(lián)
文章路徑:http://chinadenli.net/article34/ceodpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計公司、小程序開發(fā)、面包屑導(dǎo)航、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容