无效的SQLFORM提交生成故障单而不是在表单

时间:2017-01-09 18:28:48

标签: python web2py

这是我的db.py

db.define_table('antenna_details',
                Field('antenna_name',required=True),
                Field('model_name',required=True),
                Field('project_name',required=True),
                Field('frequency_band',required=True),
                Field('polarization',required=True),
                Field('aperture_size',required=True),
                Field('fixer_availability',required=True),
                Field('weight',required=True),
                Field('material',required=True),
                Field('email_id',required=True,unique=True,requires=[IS_NOT_IN_DB]),
                Field('subject',type='text',required=True),
                Field('attached',type='upload', label="""
                    Antenna/feed Geometry
                    Electrical specification
                    Attach Simulated data in predicted form
                """)
)

db.antenna_details.email_id.requires=[IS_EMAIL(),IS_NOT_EMPTY()]
db.antenna_details.attached.requires=IS_NOT_EMPTY()
db.antenna_details.subject.rquires=IS_NOT_EMPTY()
db.antenna_details.material.requires=IS_NOT_EMPTY()
db.antenna_details.weight.requires=IS_NOT_EMPTY()
db.antenna_details.fixer_availability.requires=IS_NOT_EMPTY()
db.antenna_details.aperture_size.requires=IS_NOT_EMPTY()
db.antenna_details.polarization.requires=IS_NOT_EMPTY()
db.antenna_details.frequency_band.requires=IS_NOT_EMPTY()
db.antenna_details.project_name.requires=IS_NOT_EMPTY()
db.antenna_details.model_name.requires=IS_NOT_EMPTY()

这是我的default.py索引操作:

def index():
    """
    example action using the internationalization operator T and flash
    rendered by views/default/index.html or views/generic.html

    if you need a simple wiki simply replace the two lines below with:
    return auth.wiki()
    """
    # response.flash = T("Hello World")
    # return dict(message=T('Welcome to web2py!'))

    form = SQLFORM(db.antenna_details).process()

    if form.process().accepted:
        response.flash = 'your data is posted'

    return dict(form=form)

现在,当我点击http://127.0.0.1:8000/Test/default时,我会收到表单,当我使用已存在于数据库中的电子邮件ID提交表单时,我会收到一张说明这一点的票证:

<class 'sqlite3.IntegrityError'> column email_id is not unique

模型中还有其他约束(特别是IS_NOT_EMPTY())但是当违反此约束时,应用程序只是将用户重定向回表单并以红色显示错误。但对于重复的电子邮件,它会抛出一张票。

为什么会发生这种情况以及需要做什么,以便在违反电子邮件的IS_NOT_IN_DB约束时,它应该重定向回到表单并在电子邮件字段附近显示红色错误,类似于违反IS_NOT_EMPTY约束的情况?< / p>

1 个答案:

答案 0 :(得分:1)

                Field('email_id',required=True,unique=True,requires=[IS_NOT_IN_DB]),
...
db.antenna_details.email_id.requires=[IS_EMAIL(),IS_NOT_EMPTY()]

有两个问题。首先,您的IS_NOT_IN_DB验证程序不正确 - 它应该类似于IS_NOT_IN_DB(db, 'antenna_details.email_id')

其次,在字段定义中将requires字段的email_id属性设置为IS_NOT_IN_DB之后,您将使用新的验证程序完全覆盖它,该验证程序不包括{{1 }}。您应该附加其他验证器或将它们全部定义在一起。 (就此而言,您可以将所有验证器分配移动到字段定义中,而不是将它们全部放在表定义之后。)