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

我对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.types.Integer,
                        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

点赞