问题描述
我不是编程新手,但我是Python和Flask的新手。 我有关于表单验证的设计问题。
我有一个注册表单,用于捕获用户信息以及他们所属的公司。 然后,该表单将验证电子邮件是否已被使用,但我还想验证该公司之前是否已注册。 我不希望同一家公司不止一次注册。
试图仅仅匹配公司名称可能会导致问题,因为用户不一定拼写相同的东西(即:添加或省略标点符号)。 我的想法是验证公司名称中的前X个字符,街道地址编号和邮政编码。 如果匹配,则不允许用户注册,他们将不得不打电话(或其他一些过程待确定)。
好的,真正的问题......将验证添加到WTF表单是否更好? 或者在模型中添加辅助函数? 我正在验证三个领域并且不知道哪个是最佳实践。
编辑 - 我真的在问我是否必须在多个字段上进行验证,是将它添加到表单中还是在模型中使用辅助函数?
谢谢你的协助。
吉米
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
要求。
但是这不会进行任何验证,如果您尝试创建非唯一的数据库条目,它只会抛出错误。