我对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
,因为它似乎也不是正确的解决方案。
在这种情况下验证表单的正确方法是什么?感谢您提前提出任何建议。
答案 0 :(得分:4)
终于找到了一个(klugde,但似乎这是唯一理智的选择)这样做的方式。
fs.serial_number.validators.remove(formalchemy.validators.required)
fs.mac.validators.remove(formalchemy.validators.required)
(关于我的验证器)注意,当值为None
时,FA将完全跳过所有验证,因为按照惯例,它不会将None
传递给validators.required
验证器({{1}}除外,它是硬编码的)。我已经提交了一份增强请求请求,试图解决此问题:http://code.google.com/p/formalchemy/issues/detail?id=117
答案 1 :(得分:3)
你能解释为什么nullable=True
不是解决方案吗?
对我来说,在数据库中存储空字符串似乎没用,我不鼓励它。如果没有数据而不是为数据库选择更有效的类型。
就我个人而言,我认为在字符串的情况下Django解决方案是错误的,因为它在CharFields中并不真正支持NULL。如果要在CharField中存储NULL,则必须在代码中手动执行。
答案 2 :(得分:0)
这与我遇到的问题完全相同,我经常为现有数据库编写接口并希望使用formalchemy但最终必须手动删除“requiredness”,因为我无法更改数据库。
答案 3 :(得分:0)
通过更改null_as
列属性,您可以教FormAlchemy不要将空输入替换为无。
whatever = Column(Unicode(999), required=False, null_as=("","\0"), nullable=False, default="", doc="Whatever for ever")
Formalchemy将使用null_as
替换等于None
元组的第二个成员的输入。 (第一个是SELECTs和类似字段的显示文本。)
如果将其设置为用户无法输入的字符串,则永远不会发生这种情况。