2017-01-09 4 views
0

Вот мой db.py:Invalid SQLFORM подать генерирует билет вместо того чтобы показывать ошибки в форме

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, я получите форму, и когда я отправлю ее с идентификатором электронной почты, который уже существует в базе данных, я получаю билет, в котором говорится следующее:

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

Существуют и другие ограничения в модели (в частности, IS_NOT_EMPTY()), но когда это ограничение нарушено, приложение просто перенаправляет пользователя обратно в форму и показывает ошибку в красном цвете. Но для дубликата электронного письма он выдает билет.

Почему это происходит и что необходимо сделать, чтобы при нарушении ограничения IS_NOT_IN_DB на электронную почту он должен перенаправить обратно в форму и показать красную ошибку в поле электронной почты, аналогичную тому, что происходит с нарушением ограничения IS_NOT_EMPTY?

ответ

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 в определении поля, то вы полностью переписать его с новыми валидаторов, которые не включают в себя IS_NOT_IN_DB. Вы должны либо добавить дополнительные валидаторы, либо определить их все в одном месте. (В этом отношении вы можете переместить все ваши задания валидатора в определения полей, а не поместить их после определения таблицы.)

+0

Спасибо за разъяснение. Есть ли разница между определением валидаторов в определении полей и после определения таблиц (т. Е. Внутри поля vs вне таблицы, например db.antenna_details.email_id.requires ...)? И когда мы тоже будем использовать? – rahulserver

+1

Единственное отличие состоит в том, что если вы используете параметр '' DAL (..., lazy_tables = True) '(http://web2py.com/books/default/chapter/29/06/the-database-abstraction -layer # markmin_lazy_tables), последний подход устраняет преимущества ленивых таблиц, так как 'db.mytable.myfield.requires' заставляет таблицу быть определена немедленно (при первом вызове' db.mytable', таблица полностью определена если бы это был ленивый стол). В противном случае это только вопрос личных предпочтений. В некоторых случаях вам необходимо установить атрибут 'требуется' отдельно (например, если вам нужно переопределить валидатор по умолчанию в контроллере). – Anthony

 Смежные вопросы

  • Нет связанных вопросов^_^