Мезонин и get_FOO_display

Недавно я обновился с 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:

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

Любые идеи приветствуются.


person Dustin    schedule 24.05.2014    source источник


Ответы (1)


обновление Исправлено.


Ссылка на код:

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, приведенный выше код может привести к неправильному поведению, когда в вашей модели используется Page или MultiChoiceField.

Возможно, это ошибка, и здесь я поднял вопрос. Сейчас это исправлено.

person okm    schedule 24.05.2014
comment
@StephenMcDonald Спасибо за быстрый ответ =) - person okm; 27.05.2014