加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在FormAlchemy中不要求非NULL字段(允许空字符串)

发布时间:2020-12-20 11:11:49 所属栏目:Python 来源:网络整理
导读:我对FormAlchemy很新手,似乎我没有得到什么.我有一个像这样定义的SQLAlchemy模型: ...class Device(meta.Base): __tablename__ = 'devices' id = sa.Column('id_device',sa.types.Integer,primary_key=True) serial_number = sa.Column('sn',sa.types.Unico
我对FormAlchemy很新手,似乎我没有得到什么.我有一个像这样定义的SQLAlchemy模型:

...
class Device(meta.Base):
    __tablename__ = 'devices'

    id = sa.Column('id_device',sa.types.Integer,primary_key=True)
    serial_number = sa.Column('sn',sa.types.Unicode(length=20),nullable=False)
    mac = sa.Column('mac',sa.types.Unicode(length=12),nullable=False)
    ipv4 = sa.Column('ip',sa.types.Unicode(length=15),nullable=False)
    type_id = sa.Column('type_id',sa.schema.ForeignKey('device_types.id'))
    type = orm.relation(DeviceType,primaryjoin=type_id == DeviceType.id)
...

然后在我的(Pylons)控制器中,我创建一个FormAlchemy表单,如下所示:

c.device = model.meta.Session.query(model.Device).get(device_id)
fs = FieldSet(c.device,data=request.POST or None)
fs.configure(options=[fs.ipv4.label(u'IP').readonly(),fs.type.label(u'Type').with_null_as((u'—','')),fs.serial_number.label(u'S/N'),fs.mac.label(u'MAC')])

文档说“默认情况下,NOT NULL列是必需的.你只能添加必需的,而不是删除它.”,但我想允许非NULL空字符串,validators.required不允许.在Django中是否有类似blank = True,null = False的东西?

更确切地说,我想要一个如下所示的自定义验证器,允许使用type = None的空字符串或者将所有值设置为非NULL和非空:

# For use on fs.mac and fs.serial_number.
# I haven't tested this code yet.
def required_when_type_is_set(value,field):
    type_is_set = field.parent.type.value is not None:
    if value is None or (type_is_set and value.strip() = ''):
        raise validators.ValidationError(u'Please enter a value')

如果可能的话,我想避免猴子修补formalchemy.validators.required或其他kludges.我不想在模型字段上设置nullable = True,因为它似乎也不是正确的解决方案.

在这种情况下验证表单的正确方法是什么?感谢您提前提出的任何建议.

解决方法

终于找到了一个(klugde,但似乎这是唯一理智的选择)方式来做到这一点.

fs.serial_number.validators.remove(formalchemy.validators.required)
  fs.mac.validators.remove(formalchemy.validators.required)

(关于我的验证器)注意,当值为None时,FA将完全跳过所有验证,因为按照惯例,它不会将None传递给验证器(validators.required除外,它是硬编码的).我已经提交了一份增强请求票,试图解决这个问题:http://code.google.com/p/formalchemy/issues/detail?id=117

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读