2017-11-01 4 views
0

내 장고 (wagtail) 사이트의 국제화를 최적화하려고합니다.파이썬 코드 최적화 : 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 가져 오기는 단지 우리가 우리의 장고 템플릿 ('몸')에 하나의 변수 이름을 사용할 수 있습니다 :

나는 다른 언어로 번역을 허용하는 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 필드를 생성하는 것입니다. ['en','fr'] : field이 될 경우

class TranslatedField(object): 
    def __init__(self, field, languages): 

는,이 예에서, bodylanguages 우리가이 필드에 지원하려는 언어의 배열 될 것이다 :

그래서 TranslatedField 수입과 같을 수 있습니다.

그런 다음 그 배열을 루프, for language in languages 어떻게 든이 self.{language}_field = language을 반환하고, 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_en, body_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가있다.