web2py-sqlform не может проверить уникальный = True, который используется с require = IS_LENGTH () - PullRequest
0 голосов

sqlform не показывает сообщение об ошибке, если данные имеют то же значение, которое они приняли, то появляется ошибка Error1 подробно пс. Моя цель - создать поле, содержащее 13 цифр, которые не совпадают с другими

я пытаюсь удалить требует = IS_LENGTH (maxsize = 13, minsize = 13), тогда sqlform работает нормально, но этот метод, который я не могу проверить, равна ли строка 13 или нет

db.define_table('person',
Field('h_id_card',unique=True,requires=IS_LENGTH(maxsize=13,minsize=13))
)
def add():
form = SQLFORM(db.person).process()
    return locals()

я ожидал, что sqlform покажет сообщение об ошибке вместо принятого

это то, что я ожидаю

1 Ответ

1 голос
/ 07 июля 2019

Из книги :

Обратите внимание, что requires=... применяется на уровне форм, required=True применяется на уровне DAL (вставка),в то время как notnull, unique и ondelete применяются на уровне базы данных.Хотя иногда они могут показаться избыточными, важно сохранять различие при программировании с использованием DAL.

Поскольку unique=True преобразуется в оператор UNIQUE SQL, когда вставка / обновление нарушает уникальностьограничение, вы просто получаете ошибку из базы данных, которая генерирует исключение в драйвере базы данных, который в конечном итоге генерирует исключение в коде вашего приложения, если вы его не перехватите.

Если вы вместо этого хотите включить формудля проверки требования уникальности, вы должны использовать IS_NOT_IN_DB validator :

Field('h_id_card',
      requires=[IS_LENGTH(maxsize=13, minsize=13), IS_NOT_IN_DB(db, 'person.h_id_card')])
...