Python AppEngine,EmailProperty不能是blan

2024-09-29 23:30:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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。。。你知道吗


Tags: false表单db参数init电子邮件emailgoogle
2条回答

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。你知道吗

您也可以只使用StringPropertycustom validator。你知道吗

免责声明:我没有测试过这段代码,但是这个想法是正确的。你知道吗

如果提供了电子邮件,那么只调用验证函数如何?你知道吗

class Email(unicode):
    def __init__(self, email):
        super(Email, self).__init__()
        if email != "":
            ValidateString(email, 'email')

注意,我特意选择了if email != "",而不是更像pythonic的if email,这样,如果用户提供了一个非空的“email”,它的计算结果是False,就不会导致跳过字符串验证。你知道吗

相关问题 更多 >

    热门问题