我正在使用Flask构建基于表单的应用程序,并遇到可选电子邮件字段的问题。
有没有办法设置object B
类型的数据存储区域并允许它为空?即使在实体定义中使用EmailProperty()
,它仍然会引发required=False
字段BadValueError
。
must not be empty
在Python客户端的最新几个版本中,在第879行的# my entity definition
from google.appengine.ext import db
class Model(db.Model):
email = db.EmailProperty(required=False)
中,Email类的google_appengine/google/appengine/api/datastore_types.py
调用如下所示:
__init__
它将执行传递给ValidateString,后者有一个empty_ok布尔参数,默认为class Email(unicode):
def __init__(self, email):
super(Email, self).__init__()
ValidateString(email, 'email')
:
False
如果将get设置为我的def ValidateString(value,
name='unused',
exception=datastore_errors.BadValueError,
max_len=_MAX_STRING_LENGTH,
empty_ok=False):
字段的EmailProperty
参数设置为的反转,那就太好了。例如,在我的实体定义中,由于我有required=
,如果此电子邮件类在调用required=False
时可以将True
传递到empty_ok
参数,那就太好了。但是,既然没有,我真的想找出一个好的解决方法。
我不能成为那里曾经尝试存储可选电子邮件地址字段的唯一开发人员吗?如果数据在我的表单上传递,我仍然希望运行内置验证,所以如果我能帮助它,我不想更改为ValidateString()
...
答案 0 :(得分:1)
N.B。:db模块早已被ndb模块取代。 db几年来没有收到任何重大更新。我真的建议尽可能更新,但尽管有一些想法可以解决它。
正如您已确定的那样,Email
类不会允许空值。可能这里最简单的事情就是定义你自己的类类和属性类来代替EmailProperty
:
from google.appengine.ext import db
class EmailOrNone(datastore_types.Email):
def __init__(self, email):
super(EmailOrNone, self).__init__(email)
ValidateString(email, 'email', empty_ok=True)
class EmailOrNoneProperty(db.EmailProperty):
data_type = EmailOrNone
然后只需使用新EmailOrNoneProperty
代替EmailProperty
。
您也可以将StringProperty
与custom validator一起使用。
免责声明:我没有测试过这段代码,但这个想法很合理。
答案 1 :(得分:0)
如果只提供电子邮件,那么只调用验证功能呢?
class Email(unicode):
def __init__(self, email):
super(Email, self).__init__()
if email != "":
ValidateString(email, 'email')
注意我故意转向if email != ""
而不是更加pythonic if email
,以便如果用户提供评估为False
的非空“电子邮件”,则会赢得“导致跳过字符串验证。