我正在用Flask构建一个基于表单的应用程序,遇到了一个可选电子邮件字段的问题。你知道吗
有没有办法设置EmailProperty()
类型的数据存储字段并允许它为空?似乎即使实体定义中有required=False
,它仍然会引发BadValueError
,表示字段must not be empty
。你知道吗
# my entity definition
from google.appengine.ext import db
class Model(db.Model):
email = db.EmailProperty(required=False)
在Python客户机的最新版本中,在第879行附近的google_appengine/google/appengine/api/datastore_types.py
中,Email类的__init__
调用如下所示:
class Email(unicode):
def __init__(self, email):
super(Email, self).__init__()
ValidateString(email, 'email')
它将执行传递给ValidateString,ValidateString有一个空的\u ok boolean参数,默认为False
:
def ValidateString(value,
name='unused',
exception=datastore_errors.BadValueError,
max_len=_MAX_STRING_LENGTH,
empty_ok=False):
如果get设置为我的EmailProperty
字段的required=
参数的倒数就好了。例如,在我的实体定义中,因为我有required=False
,所以当调用ValidateString()
时,如果这个Email类能够将True
传递到empty_ok
参数中就更好了。然而,既然没有,我真的很想找出一个好的解决办法。你知道吗
我不是唯一一个尝试存储可选电子邮件地址字段的开发人员?如果数据在我的表单上传递,我仍然希望运行内置的验证,所以如果我能帮助它,我不想更改为StringProperty
。。。你知道吗
N.B.:db模块早已被ndb模块取代。db已经好几年没有收到任何重要的更新了。我真的建议更新,如果可能的话,但尽管如此,这里有一些想法来解决它。你知道吗
正如您所确定的,
Email
类不允许空值。这里最简单的方法可能就是定义自己的类型类和属性类来代替EmailProperty
:然后用新的
EmailOrNoneProperty
代替EmailProperty
。你知道吗您也可以只使用
StringProperty
和custom validator。你知道吗免责声明:我没有测试过这段代码,但是这个想法是正确的。你知道吗
如果提供了电子邮件,那么只调用验证函数如何?你知道吗
注意,我特意选择了
if email != ""
,而不是更像pythonic的if email
,这样,如果用户提供了一个非空的“email”,它的计算结果是False
,就不会导致跳过字符串验证。你知道吗相关问题 更多 >
编程相关推荐