2017-12-26 14 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_verboseマイMultilingualCharField 2つの列を作成します。name_itname_enを、私はこれらのいずれかにistancesを注文したいです。あなたがそれを必要とする場合は、ここで(DjangoのクックブックによるWeb開発の)コードは次のとおりです。

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_enname_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を見つけた場合エターの方法で教えてください

関連する問題