Я пытался сделать MultilingualModel в Django, но язык остается по умолчанию и не меняется
Я пытаюсь сделать многоязычную модель в Django. Но мой код не работает, он просто игнорирует мою функцию select_language и выбирает default_language. Я понятия не имею, что вызывает ошибку. Вот мой код
models.py
class MultilingualQuerySet(models.query.QuerySet):
selected_language = None
def __init__(self, *args, **kwargs):
super(MultilingualQuerySet, self).__init__(*args, **kwargs)
def select_language(self, lang):
self.selected_language = lang
return self
def iterator(self):
result_iter = super(MultilingualQuerySet, self).iterator()
for result in result_iter:
if hasattr(result, 'select_language'):
result.select_language(self.selected_language)
yield result
def _clone(self, *args, **kwargs):
qs = super(MultilingualQuerySet, self)._clone(*args, **kwargs)
if hasattr(qs, 'select_language'):
qs.select_language(self.selected_language)
return qs
class MultilingualManager(models.Manager):
use_for_related_fields = True
selected_language = None
def select_language(self, lang):
self.selected_language = lang
return self
def get_query_set(self):
qs = MultilingualQuerySet(self.model, using=self._db)
return qs.select_language(self.selected_language)
class MultilingualModel(models.Model):
objects = MultilingualManager()
# fallback/default language code
default_language = None
# currently selected language
selected_language = None
class Meta:
abstract = True
def select_language(self, lang):
"""Select a language"""
self.selected_language = lang
return self
def __getattribute__(self, name):
def get(x):
return super(MultilingualModel, self).__getattribute__(x)
try:
# Try to get the original field, if exists
value = get(name)
# If we can select language on the field as well, do it
if isinstance(value, MultilingualModel):
value.select_language(get('selected_language'))
return value
except AttributeError as e:
# Try the translated variant, falling back to default if no
# language has been explicitly selected
lang = self.selected_language
if not lang:
lang = self.default_language
if not lang:
raise
value = get(name + '_' + lang)
# If the translated variant is empty, fallback to default
if isinstance(value, str) and value == u'':
value = get(name + '_' + self.default_language)
return value
class Blog(MultilingualModel):
default_language = 'es'
title_en = models.CharField(max_length=300, blank=True, default='')
title_es = models.CharField(max_length=300, blank=True, default='')
text_en = models.TextField(blank=True, default='')
text_es = models.TextField(blank=True, default='')
photo1 = models.ImageField(upload_to='photos_blog/%Y/%m/')
def __str__(self):
return self.title
И я попытался получить все объекты Blog с английским названием
`
print(Blog.objects.select_language('en').all())
` Но все равно у меня есть испанские названия