내 장고 (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):
는,이 예에서, body
및 languages
우리가이 필드에 지원하려는 언어의 배열 될 것이다 :
그래서 TranslatedField
수입과 같을 수 있습니다.
그런 다음 그 배열을 루프, for language in languages
어떻게 든이 self.{language}_field = language
을 반환하고, def __get__(self, instance, owner):
어떻게 든 루프에서 다시 모든 언어 통해 if translation.get_language() == language
말 :. 반환 getattr (예, 자기 {language_field을}`() 의사 인 이상
기존 모델을 재구성하고 필요한 필드를보다 효과적으로 렌더링하려면 어떻게 가져 옵니까? 대답은 루프와 사전의 조합을 사용하는 것과 관련이 있다고 생각하지만 동적으로 성공하지 못했습니다. 지금까지 작성 및 구현.