【问题标题】:Flask form validation designFlask 表单验证设计
【发布时间】:2014-03-09 15:06:17
【问题描述】:

我对编程并不陌生,但我是 Python 和 Flask 的新手。我有一个关于表单验证的设计问题。

我有一个注册表单,其中包含用户信息以及他们所属的公司。然后表单会验证电子邮件是否已被使用,但我还想验证公司之前是否已注册。我不希望同一家公司注册多次。

尝试仅匹配公司名称可能会导致问题,因为用户不一定会拼写相同的内容(即:添加或省略标点符号)。我的想法是验证公司名称、街道地址号码和邮政编码中的前 X 个字符。如果匹配,则不允许用户注册,他们将不得不致电(或其他一些待确定的过程)。

好的,真正的问题...将验证添加到 WTF 表单是否更好?还是在模型中添加辅助函数?我正在验证三个字段,但不知道哪个是最佳做法。

编辑 - 我真的在问我是否必须验证多个字段,我是将其添加到表单中还是在模型中使用辅助函数?

感谢您的帮助。

吉米

【问题讨论】:

  • 为什么不将数据同质化,让用户不会犯你提到的错误呢?我认为至少应该涵盖明显的内容,例如A company, a company, company, the company。在保存到数据库之前,我只需将所有这些转换为 company ..
  • 这可能行得通。我会考虑更多,但乍一看,我认为我仍然需要进行验证,因为很可能在多个城市/州拥有相同名称的公司。

标签: python forms validation flask


【解决方案1】:

在这种情况下,使用 WTForms 进行验证可能会更好。向用户发送错误消息会更容易。

在 WTForms 中,很容易添加custom validator

class MyForm(Form):
company = TextField('Company', [Required()])

def validate_company(form, field):
    if len(field.data) > 50:
        raise ValidationError('Name must be less than 50 characters')

但是,在您的情况下,这将不起作用,因为您想要执行多个字段。 WTForms 来救援!您可以通过field enclosure 验证您的所有公司字段。这将允许您将“公司信息”视为一个字段并验证每个字段。

class CompanyForm(Form):
    name = StringField('Company name', [validators.required()])
    address    = StringField('Address', [validators.required()])

class RegistrationForm(Form):
    first_name   = StringField()
    last_name    = StringField()
    company = FormField(CompanyForm, [your_custom_validation])

您还可以向数据库模型添加唯一性要求。不确定您的数据库是什么,但 MongoDB 提供了unique_with 要求。但这不会进行任何验证,如果您尝试创建非唯一的数据库条目,它只会引发错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多