【问题标题】:How-to customize WTForm model_form field mapping?如何自定义 WTForm model_form 字段映射?
【发布时间】:2013-07-05 05:20:03
【问题描述】:

我正在使用 Flask 和 Wtforms(和 Flask-WTF)为模型 CRUD 创建表单。我遇到了一个我今天无法弄清楚的问题,主要是:

给定以下常量定义:

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 字段)表示为选择字段的表单生成?

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    最好尝试使用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()),
        }
    })
    

    【讨论】:

    • 这很完美!谢谢。另外,我会阅读 db.enum。
    猜你喜欢
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多