首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FormAlchemy中不需要非空字段(允许空字符串)

在FormAlchemy中不需要非空字段(允许空字符串)
EN

Stack Overflow用户
提问于 2009-09-22 12:54:57
回答 4查看 2.8K关注 0票数 3

我是FormAlchemy的新手,看起来我不懂什么。我有一个定义如下的SQLAlchemy模型:

代码语言:javascript
复制
...
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表单,如下所示:

代码语言:javascript
复制
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')])

文档说“默认情况下,需要非空列。您只能添加required-ness,而不能删除它。”,但是我想允许非空字符串,这是validators.required所不允许的。姜戈有没有像blank=True, null=False这样的东西?

更准确地说,我想要一个像下面这样的自定义验证器,允许带有type=None的空字符串或所有值都被设置为非空和非空:

代码语言:javascript
复制
# 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或其他杂乱无章的东西。我不想在模型字段上设置nullable=True,因为它似乎也不是合适的解决方案。

在这种情况下,验证表单的正确方法是什么?感谢您提前给我提建议。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-23 07:02:09

最终找到了一个杂凑的东西,但这似乎是唯一明智的方法:

代码语言:javascript
复制
  fs.serial_number.validators.remove(formalchemy.validators.required)
  fs.mac.validators.remove(formalchemy.validators.required)

对于验证器函数,当值为None时,FA将完全跳过所有验证,因为按照惯例,它不会将None传递给验证器(除非设置了validators.required,这是硬编码的)。我已经提交了一个增强请求ticket试图解决这个问题。

票数 4
EN

Stack Overflow用户

发布于 2009-09-22 21:22:02

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

对我来说,在数据库中存储空字符串似乎是无用的,我不鼓励这样做。如果没有数据,请为数据库选择更有效的类型。

就我个人而言,我认为在字符串情况下的Django解决方案是错误的,因为它并不真正支持CharFields中的NULL。如果您想在CharField中存储NULL,则必须在代码中手动完成。

票数 3
EN

Stack Overflow用户

发布于 2010-12-20 03:58:21

这与我遇到的问题完全相同,我经常为现有数据库编写接口,并希望使用formalchemy,但最终不得不手动删除“要求”,因为我无法更改数据库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1459919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档