我最近从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
而不是Page
,get_prop_display()
按预期工作,我得到Out[3]: Aardvarks and Bubblegum
任何见解都表示赞赏。
答案 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相比,上述代码可能会在您的模型中使用Page
或MultiChoiceField
时导致错误行为。
也许这是一个错误,here我提出了一个问题。现在已修复。