創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司長(zhǎng)期為上千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為民樂(lè)企業(yè)提供專(zhuān)業(yè)的網(wǎng)站制作、網(wǎng)站設(shè)計(jì),民樂(lè)網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。小編給大家分享一下Django自定義Field實(shí)現(xiàn)多語(yǔ)言的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Django高級(jí)編程之自定義Field實(shí)現(xiàn)多語(yǔ)言
自定義數(shù)據(jù)庫(kù)字段
擴(kuò)展默認(rèn)的models.CharField和models.TextField使之成為支持多語(yǔ)言的字段。可以輕松實(shí)現(xiàn)復(fù)用,無(wú)需配置多余選項(xiàng)。
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中配置多語(yǔ)言
LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' LANGUAGES = ( ('en-us', 'US English'), ('zh-hans', 'Asia/Shanghai') )
默認(rèn)語(yǔ)言設(shè)置為中文,多語(yǔ)言為英語(yǔ)
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ù)庫(kù)字段自動(dòng)生成了相應(yīng)語(yǔ)言的字段,當(dāng)用戶(hù)語(yǔ)言切換到其他,可以自動(dòng)適配實(shí)現(xiàn)多語(yǔ)言。
以上是Django自定義Field實(shí)現(xiàn)多語(yǔ)言的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
網(wǎng)頁(yè)標(biāo)題:Django自定義Field實(shí)現(xiàn)多語(yǔ)言的方法-創(chuàng)新互聯(lián)
文章路徑:http://www.rwnh.cn/article34/ceodpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、小程序開(kāi)發(fā)、面包屑導(dǎo)航、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容