私はdjango(wagtail)サイトの国際化を最適化しようとしています。Pythonコードの最適化:django/wagtailのクラス内でループ内に動的変数を作成する
がfrom internationalization.translatedfield import TranslatedField
class BlogPage(Page):
body_en = RichTextField(blank=True)
body_fr = RichTextField(blank=True)
body = TranslatedField(
'body_en',
'body_fr'
)
content_panels = Page.content_panels + [
FieldPanel('body_en', classname="full"),
FieldPanel('body_fr', classname="full"),
]
translatedfieldインポートはちょうど私達が私達のDjangoテンプレート(「体」)で、単一の変数名を使用することができます:
は、私は別の言語への翻訳を可能CMSためのフィールドを作成したモデルを持っています:
from django.utils import translation
class TranslatedField(object):
def __init__(self, en_field, fr_field):
self.en_field = en_field
self.fr_field = fr_field
def __get__(self, instance, owner):
if translation.get_language() == 'fr':
return getattr(instance, self.fr_field)
else:
return getattr(instance, self.en_field)
、テンプレートで:
{{ page.body|richtext }}
このすべてが可能にCMSユーザが 'body_fr'と 'body_en'フィールドのテキストを入力し、訪問者があったURLに基づいて、フランス語または英語の翻訳を出力する。 site.com/en/blog
またはsite.com/fr/blog
)。
問題は多分数十の言語と数十のフィールドがある可能性があるため、このモデルがどのように非常に大きくなるかを見ることができます。ですから、私はループ内でself.en_field
と.fr
フィールドを動的に作成したいと考えています。
のでTranslatedField
輸入のようなものに見えるかもしれません:['en','fr']
:
field
は次のようになり
class TranslatedField(object):
def __init__(self, field, languages):
を、この例では、body
とlanguages
たちは、このフィールドをサポートする言語の配列になります。
そしてIはループself.{language}_field = language
が返される配列、for language in languages
通って何とかだろう、そしてすべての言語を介しdef __get__(self, instance, owner):
に何とかループ再びif translation.get_language() == language
を言う:擬似コードである上記戻りGETATTR(例えば、自己{language_field} `()
既存のモデルを再構築し、必要なフィールドをより効果的にレンダリングするにはどうすればよいですか?答えにはループと辞書の組み合わせを使用するかもしれませんが、私は動的に成功しませんこれまでの作成と実装