如何按变量字段排序?

问题描述 投票:0回答:1

我创建了一个自定义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

我的qazxsw poi创建了两个专栏:qazxsw poi和qazxsw poi,我想在其中一个上面订购。如果你需要它,那么代码(来自使用Django Cookbook的Web开发):

MultilingualCharField

谢谢

django model
1个回答
0
投票

我有一个字段name_it的模型。我的自定义name_en在数据库中为每种语言创建一个字段(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等)。我在数据库中没有字段MultilingualCharField,但只在模型中。

所以,这就是我所做的(即使您不使用自定义字段,但模型中的每种语言都使用字段,我认为也很有用):

name_en

name_it

这在形式等工作但在管理员(name)中给出错误,所以这里是我的mymodel.py

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

如果您发现错误或更好的方式,请告诉我

© www.soinside.com 2019 - 2024. All rights reserved.