Django自定義Field實(shí)現(xiàn)多語(yǔ)言的方法-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)公司長(zhǎng)期為上千家客戶提供的網(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è)提供專業(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ǔ)言的字段??梢暂p松實(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

效果圖

Django自定義Field實(shí)現(xiàn)多語(yǔ)言的方法

可以看到,數(shù)據(jù)庫(kù)字段自動(dòng)生成了相應(yīng)語(yǔ)言的字段,當(dāng)用戶語(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://bm7419.com/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)容(圖片、視頻和文字)以用戶投稿、用戶轉(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)

外貿(mào)網(wǎng)站建設(shè)