Flask-WTF по умолчанию для SelectField не работает для типов перечисления SQLAlchemy - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть сайт Flask-SQLAlchemy, который использует тип перечисления SQLAlchemy для определенных столбцов, чтобы ограничить возможные входные значения.

Например, у меня есть перечисление "тип платежа", котороеимеет несколько вариантов типа оплаты, например:

class PaymentType(enum.Enum):
    fixed = "fixed"
    variable = "fixed_delivery"
    quantity_discount = "quantity_discount"

Когда я использую это в раскрывающемся списке / выберите, я могу указать такие параметры, как:

prd_payment_type = SelectField(_('prd_payment_type'), choices=SelectOptions.PaymentTypes.All(0, _('PleaseSelect')))

Функция All ()Я звоню, возвращает различные значения перечисления в качестве параметров, а также добавляет пользовательский параметр «Пожалуйста, выберите ...» в раскрывающемся списке.Выглядит это так:

class PaymentTypes(object):

    @staticmethod
    def All(blank_value=None, blank_text=None):
        ret = [(i.value, _(i.name)) for i in PaymentType]
        SelectOption.add_blank_item(ret, blank_value, blank_text)
        return ret

Пока все хорошо, я получаю хороший выпадающий список с правильными параметрами.проблема возникает, когда я хочу отобразить форму, используя уже существующий объект SQLAlchemy из базы данных.

Когда я выбираю объект из SQLAlchemy, свойство prd_payment_type содержит enum PaymentType.quantity_discount, а не просто строковое значение «amount_discount»: enter image description here

Поскольку WTForms (предположительно) соответствует предварительно выбранному параметру в раскрывающемся списке строковому значению «amount_discount»msgstr ", он не соответствует перечислению в модели SQLAlchemy, и опция не выбрана в раскрывающемся списке.

SelectField WTForms принимает список кортежей, содержащих строки, как варианты.Я не могу кормить это своим перечислением.С другой стороны, модель SQLAlchemy возвращает тип перечисления в качестве свойства для prd_payment_type.Я мог бы переопределить это свойство или что-то в этом роде, но кажется, что для поддержки перечислений SQLAlchemy в WTForms требуется много работы.

Есть ли стандартное решение для работы с перечислениями SQLAlchemy в SelectField WTForms или я должен отказаться от использования перечислений вообще и просто хранить строки, может быть, из списка констант, чтобы контролировать их?

1 Ответ

0 голосов
/ 23 ноября 2018

Я нашел решение сам.Кажется, что когда перечисление имеет

def __str__(self):
    return str(self.value)

Этого достаточно для WTForms, чтобы сопоставить значение базы данных со значением SelectField.Я создал базовый класс, производный от enum.Enum, и добавил приведенный выше код для возврата значения enum в виде строкового представления.

Это решение было основано на подобных проблемах, которые я обнаружил позже:

https://github.com/flask-admin/flask-admin/issues/1315

Python Flask WTForm SelectField со значениями Enum 'Неправильный выбор' при проверке

...