我是正弦机构的新手,看来我没有得到任何东西。我有这样定义的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)
...

然后,在我的(塔)控制器中,我创建了这样的正式形式:

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')])

该文档说“默认情况下,不需要零列。您只能添加必要性,而不是删除它。 validators.required 放弃。有类似的东西吗 blank=True, null=False 在django?

更确切地说,我希望下面像一个自定义验证器 type=None 或所有要设置的非零和非空的值:

# 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)

(关于我的验证者)注意,FA将 完全地 在值为时跳过所有验证 None, ,因为根据会议,它不会通过 None 到验证者(除了 validators.required, ,这是硬编码)。我已经提交了一张增强请求票,试图解决此问题: http://code.google.com/p/formalchemy/issues/detail?id=117

其他提示

你能解释为什么 nullable=True 不会是解决方案吗?

对我来说,将空字符串存储在数据库中似乎毫无用处,我不会鼓励它。如果没有数据,请选择数据库更有效的类型。

我个人认为,在字符串的情况下,Django解决方案是错误的,因为它并不真正支持Charfields中的Null。如果您想将NULL存储在Charfield中,则必须在代码中手动进行操作。

这是我遇到的完全相同的问题,在那里我经常为现有数据库编写接口,并希望使用正弦,但最终必须手动删除“必需性”,因为我无法更改数据库。

您可以教福音,不要通过更改无需替换空的输入 null_as 列属性。

 whatever = Column(Unicode(999), required=False, null_as=("","\0"), nullable=False, default="", doc="Whatever for ever")

Surmchemy将替换等于第二个成员的输入 null_as 借助元组 None. 。 (第一个是选择和类似字段的显示文本。)

如果将其设置为用户无法输入的字符串,这将永远不会发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top