夹层和get_FOO_display

时间:2014-05-24 00:45:11

标签: django mezzanine

我最近从Django Mezzanine从1.4升级到3.1.4。除了扩展Mezzanine Page类的模型出错外,转换一直很顺利。当我在任何选择字段上调用get_FOO_display属性时,我会在每个字符之间获得带有&的短名称。例如,如果我有测试类:

from mezzanine.pages.models import Page

class TestModel(Page):
    CHOICES = (
        ('ab', "Aardvarks and Bubblegum"),
        ('cd', "Coocoos and Diphtheria"),
    )

    prop = models.CharField(max_length=2, choices=CHOICES)

我在Django shell中得到以下内容:

In [1]: from project.models import TestModel

In [2]: test = TestModel(prop="ab")

In [3]: test.get_prop_display()
Out[3]: u'a & b'

如果我的模型只是扩展models.Model而不是Pageget_prop_display()按预期工作,我得到Out[3]: Aardvarks and Bubblegum

任何见解都表示赞赏。

1 个答案:

答案 0 :(得分:1)

<强>更新 它已被修复。


参考the code

def contribute_to_class(self, cls, name):
    def _get_FIELD_display(self, field):
        value = getattr(self, field.attname)
        value = force_text(" & ".join([dict(field.choices).get(v, v)
                                       for v in value]), strings_only=True)
        return value
    setattr(cls, '_get_FIELD_display', _get_FIELD_display)

    super(MultiChoiceField, self).contribute_to_class(cls, name)

MultiChoiceField无条件覆盖其所在模型的_get_FIELD_display方法。在您的代码中,该模型为Page,字段为Page.in_menus

Django's logic相比,上述代码可能会在您的模型中使用PageMultiChoiceField时导致错误行为。

也许这是一个错误,here我提出了一个问题。现在已修复。