2017-11-01 4 views
0

私は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): 

を、この例では、bodylanguagesたちは、このフィールドをサポートする言語の配列になります。

そしてIはループself.{language}_field = languageが返される配列、for language in languages通って何とかだろう、そしてすべての言語を介しdef __get__(self, instance, owner):に何とかループ再びif translation.get_language() == languageを言う:擬似コードである上記戻りGETATTR(例えば、自己{language_field} `()

既存のモデルを再構築し、必要なフィールドをより効果的にレンダリングするにはどうすればよいですか?答えにはループと辞書の組み合わせを使用するかもしれませんが、私は動的に成功しませんこれまでの作成と実装

答えて

0

これは完全な回答ではありませんが、うまくいけばあなたは正しい軌道に乗っています。

最初はあなたが単純化することができると思うがTranslatedFieldの建設であり、それはそうのような__get__方法です:

class TranslatedField(object): 
    def __init__(self, field_name, languages): 
     self.field_name = field_name 
     self.languages = languages 

    def __get__(self, instance, owner): 
     required_lang = translation.get_language() 
     lang = required_lang if required_lang in self.languages else self.languages[0] 
     translated_field_name = '%s_%s' % (self.field_name, lang) 
     return getattr(instance, translated_field_name) 

あなたはまだbody_enbody_frを作成する必要がありますというようにそれがスタートです。

body_xxxフィールドをすべて作成する必要はなく、body = TranslatedField(field_type=RichText, field_args=None, fields_kwargs={'blank': True}, languages=['en', 'fr'])の代わりにcontribute_to_classを参照する必要があります。

Btw、そこにいくつかの価値があるかもしれないWagtailのためにそこにあるtranslation librariesがあります。

関連する問題