Flask 表单验证设计

5 投票
1 回答
3844 浏览
提问于 2025-04-17 21:31

我对编程不算陌生,但我刚接触Python和Flask。现在我有一个关于表单验证的设计问题。

我有一个注册表单,用来收集用户信息和他们所属的公司。这个表单会检查邮箱是否已经被使用,但我还想验证一下这个公司是否之前已经注册过。我不想让同一家公司重复注册。

仅仅根据公司名称来匹配可能会出问题,因为用户的拼写方式不一定相同(比如:有的人可能会加标点,有的人则不加)。我想的办法是验证公司名称的前几个字符、街道地址的号码和邮政编码。如果有匹配的情况,用户就不能注册,他们需要打电话来(或者其他待定的流程)。

好吧,真正的问题是……把验证放在WTF表单里更好,还是在模型里加一个辅助函数?我需要验证三个字段,不知道哪种做法更好。

补充一下 - 我其实是在问,如果我需要验证多个字段,是把验证放在表单里,还是用模型里的辅助函数?

谢谢你的帮助。

Jimmy

1 个回答

1

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

在WTForms中,添加一个自定义验证器非常简单:

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来帮忙!你可以通过字段封装来验证所有的公司字段。这样你就可以把“公司信息”当作一个字段来处理,并对每个字段进行验证。

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的要求。不过,这并不会进行验证,只是在你尝试创建重复的数据库条目时抛出错误。

撰写回答