2017-12-26 5 views
0

사용자 지정 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_verboseMultilingualCharField 두 개의 열을 만듭니다 name_itname_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와 모델이 당신에게

답변

0

감사드립니다. 내 사용자 지정 MultilingualCharField은 데이터베이스에 각 언어 (name_en, name_it 등) 필드를 만듭니다. I 의 데이터베이스에 name 필드가 있지만 모델에서만 필드가 없습니다.

mymodel.py에서 :

class MyClass(models.Model): 
    ... 
    class Meta: 
     ordering = [_('name_it')] 

그래서, 내가 한 여기에 무엇을 (난 당신이 모델의 각 언어에 대한 사용자 정의 필드 만 필드를 사용하지 않는 경우에도 유용 할 수 있다고 생각) 형태 등으로 작동하지만 관리자의 오류 (TypeError: expected string or bytes-like object를) 제공이

, 그래서 여기 내 Admin.py입니다 :

class MyClassAdmin(admin.ModelAdmin): 
    def get_ordering(self, request): 
     if get_language_from_request(request)=='it': 
      return ['name_it'] 
     else: 
      return ['name_en'] 

오류 또는 AB를 발견하면 에 터 방식 제발 말해