4

モデルCRUDのフォームを作成するために、Wtforms(およびFlask-WTF)でFlaskを使用しています。今日、主に理解できなかった質問に出くわしました。

次の定数定義があるとします。

ADMIN = 0
STAFF = 1
USER = 2
ROLE = {
    ADMIN: 'admin',
    STAFF: 'staff',
    USER: 'user'}

次のモデルが与えられます。

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(80))
    last_name = db.Column(db.String(80))
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    password = db.Column(db.String(160))
    role = db.Column(db.SmallInteger, default=USER.USER)
    status = db.Column(db.SmallInteger, default=USER.NEW)

次のフォーム生成コードが与えられます。

UserEdit = model_form(models.User, base_class=Form, exclude=['password'])

role(SmallInteger フィールド) を選択フィールドとして表すフォーム生成の変更を提案できる人はいますか?

4

1 に答える 1

7

db.Enum役割に使用してみてください。ただし、フィールドに独自のウィジェットを設定することもできます:

from wtforms.widgets import Select


class ChoicesSelect(Select):
    def __init__(self, multiple=False, choices=()):
        self.choices = choices
        super(ChoicesSelect, self).__init__(multiple)

    def __call__(self, field, **kwargs):
        field.iter_choices = lambda: ((val, label, val == field.default) 
                                      for val, label in self.choices)
        return super(ChoicesSelect, self).__call__(field, **kwargs)

UserEdit = model_form(User, exclude=['password'], field_args={
    'role': {
        'widget': ChoicesSelect(choices=ROLE.items()),
    }
})
于 2013-07-08T06:40:32.207 に答える