2015-02-18 2 views
0

Я знаю, что в этот раз этот вопрос задается на форуме, но, пожалуйста, мне нужна ваша помощь, поскольку я не могу понять, что я делаю неправильно ,web2py: sqlite3.IntegrityError '> (ограничение внешнего ключа не удалось)

Модель

db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all']) 
auth = Auth(db) 
service = Service() 
plugins = PluginManager() 
auth.define_tables(migrate=False) 
auth.define_tables(username=False, signature=False) 

db.define_table('nsksystem', 
      Field('email_id', db.auth_user,length=512, label = 'Email ID'), 
      Field('nskname', length=128, default='', label = 'Machine Name'), 
      Field('nskpassword', 'password', length=512,readable=False, label='Machine Password'), 
      Field('confirmnskpassword', 'password', length=512,readable=False, label='Confirm Machine Password'), 
      Field('nreleaseid',length=128, default='',label = 'Release'), 
      Field('isCordinator','boolean',default='', label = 'Is Co-ordinator')) 

db.nsksystem.email_id.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty) 
db.nsksystem.email_id.requires = IS_IN_DB(db,'auth_user.email','%(email)s') 
db.nsksystem.nreleaseid.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty) 
db.nsksystem.nskname.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty) 
db.nsksystem.confirmnskpassword.requires = IS_EXPR('value==%s' % repr(request.vars.get('nskpassword', None)),error_message='Passwords do not match') 
db.nsksystem.isCordinator.requires=IS_NOT_IN_DB(db(db.nsksystem.nreleaseid == request.vars.nreleaseid), 'nsksystem.isCordinator', error_message='Co-ordinator Already exist for specified release') 

Контроллер

def uregistration(): 
    form=SQLFORM(db.auth_user) 
     if form.process().accepted: 
      response.flash = 'User is registered. Redirecting to machine registration' 
      redirect(URL('mregistration')) 
     elif form.errors: 
      response.flash = 'Form has errors' 
     else: 
      response.flash = 'Please fill out the form' 
     return dict(form=form) 
def mregistration(): 
     form=SQLFORM(db.nsksystem) 
      if form.process().accepted: 
       response.flash = 'Machine is registered to user. Please go to Login page.' 
       redirect(URL('index')) 
      elif form.errors: 
       response.flash = 'Form has errors' 
      else: 
       response.flash = 'Please fill out the form' 
       return dict(form=form) 

После того, как я сделал успешную регистрацию, я был направлен в регистрации машины URL. Мне нужно было выбрать идентификатор электронной почты из списка выпадающего списка. Этот идентификатор электронной почты, который я указал во время регистрации. После того как я отправлю, я получаю эту ошибку.

Traceback

Traceback (most recent call last): 
    File "gluon/restricted.py", line 224, in restricted 
    File "C:/web2py/applications/click/controllers/default.py", line 63, in <module> 
    File "gluon/globals.py", line 393, in <lambda> 
    File "C:/web2py/applications/click/controllers/default.py", line 30, in mregistration 
    if form.process().accepted: 
    File "gluon/html.py", line 2303, in process 
    File "gluon/html.py", line 2240, in validate 
    File "gluon/sqlhtml.py", line 1677, in accepts 
    File "gluon/dal/objects.py", line 724, in insert 
    File "gluon/dal/adapters/base.py", line 715, in insert 
IntegrityError: foreign key constraint failed 

Error snapshot 
    <class 'sqlite3.IntegrityError'>(foreign key constraint failed) 

Function argument list 


    (self=<gluon.dal.adapters.sqlite.SQLiteAdapter object>, 
    table=<Table nsksystem (id,email_id,nskname,nskpassword,confirmnskpassword,nreleaseid,isCordinator)>, 
    fields=[(<gluon.dal.objects.Field object>, '1234'), 
    (<gluon.dal.objects.Field object>, 'yennae.ind.codefactory.com'), 
    (<gluon.dal.objects.Field object>, 0), 
    (<gluon.dal.objects.Field object>, True), 
    (<gluon.dal.objects.Field object>, 'AAA'), 
    (<gluon.dal.objects.Field object>, '1234')]) 

И к тому же я не вижу мой электронный идентификатор отображается в списке аргумента функции, которая отображается в билете. Я не могу отключить ограничение, поскольку это требование.

И следующее, даже если я сброшу свой файл db.auth_user, автоматически создаются 10 записей. Как я могу остановить это.

ответ

2

db.nsksystem.email_id определен как ссылка на таблицу db.auth_user, что означает, что она должна хранить идентификатор записи от db.auth_user (который является целым числом), а не адресом электронной почты. Таким образом, валидатор вы определили неверно:

db.nsksystem.email_id.requires = IS_IN_DB(db, 'auth_user.email', '%(email)s') 

Это должно быть вместо этого:

db.nsksystem.email_id.requires = IS_IN_DB(db, 'auth_user.id', '%(email)s') 

На самом деле, нет никаких причин, чтобы явно определить, что валидатор, как это валидатор по умолчанию для поле ссылки. (Обратите внимание, то выберите виджет HTML будет отображаться список адресов электронной почты, но фактическое значение представляется и хранится будет auth_user идентификатор записи, связанный с адресом электронной почты.)

Некоторые другие проблемы:

Дон» t вызовите auth.define_tables() дважды (и не вызывайте его с помощью migrate=False, если только таблицы не были определены так, как вам нужно).

Не устанавливайте атрибут requires поля дважды, так как второй будет просто перезаписывать первый. Кроме того, нет необходимости устанавливать валидатор IS_NOT_EMPTY, если есть также валидатор IS_IN_DB, так как последний не допускает пустых значений.

+0

Спасибо Anthony .. за ваше время. Я исправил это с вашим советом ... Спасибо тонну .. – May

+0

У меня есть один вопрос, но .. как остановить auth_user базы данных, автопопуляцией с информацией о пользователе .. например ... прежде чем я добавлю записи в auth_user db .. у него есть 10 записей .. хотя я их удаляю, еще 10 добавляются автоматически ... – May

+0

У вас должен быть какой-то код где-то, что добавляет 10 случайных записей, если таблица пуста - вероятно, где-то в файле модели. – Anthony