사용자 지정 MultilingualCharField를 만들고 적절한 언어로 인스턴스를 주문하고 싶습니다. 나는 모델에서 그렇게하는 것을 선호한다. (이것이 좋은 생각이 아니 었는지 말해라.) 가능한가?가변 필드로 주문하는 방법?
class Myclass(models.Model):
name = MultilingualCharField(max_length=32, unique=True)
...
def __str__(self):
name_traslated={'name_it': self.name_it, 'name_en': self.name_en}
name_verbose=_('name_it')
return name_traslated[name_verbose]
class Meta:
#name_traslated={'name_it': self.name_it, 'name_en': self.name_en}
name_verbose=_('name_it')
ordering = [name_verbose]
#ordering = [name_traslated[name_verbose]]
__str__
작동되지만 ordering
이되지 않습니다 : 그것은 준다
TypeError: 'class Meta' got invalid attribute(s): name_verbose
내 MultilingualCharField
두 개의 열을 만듭니다 name_it
및 name_en
을 나는 이들 중 하나에 istances를 주문하고 싶다. 당신이 여기에 (장고 요리 책과 웹 개발에서) 코드입니다해야하는 경우 :
class MultilingualCharField(models.CharField):
def __init__(self, verbose_name=None, **kwargs):
self._blank = kwargs.get("blank", False)
self._editable = kwargs.get("editable", True)
#super(MultilingualCharField, self).__init__(verbose_name, **kwargs)
super().__init__(verbose_name, **kwargs)
def contribute_to_class(self, cls, name, virtual_only=False):
# generate language specific fields dynamically
if not cls._meta.abstract:
for lang_code, lang_name in settings.LANGUAGES:
if lang_code == settings.LANGUAGE_CODE:
_blank = self._blank
else:
_blank = True
localized_field = models.CharField(string_concat(
self.verbose_name, " (%s)" % lang_code),
name=self.name,
primary_key=self.primary_key,
max_length=self.max_length,
unique=self.unique,
blank=_blank,
null=False,
# we ignore the null argument!
db_index=self.db_index,
rel=self.rel,
default=self.default or "",
editable=self._editable,
serialize=self.serialize,
choices=self.choices,
help_text=self.help_text,
db_column=None,
db_tablespace=self.db_tablespace
)
localized_field.contribute_to_class(cls,
"%s_%s" % (name, lang_code),)
def translated_value(self):
language = get_language()
val = self.__dict__["%s_%s" % (name, language)]
if not val:
val = self.__dict__["%s_%s" % (name, settings.LANGUAGE_CODE)]
return val
setattr(cls, name, property(translated_value))
내가 필드
name
와 모델이 당신에게