This syntax:

'reference %s' % auth.settings.table_user_name

is not about being lazy tables compliant -- it is just a way to construct a 
string when part of the string is stored in a variable (another option 
would be 'reference ' + auth.settings.table_user_name). You could just as 
easily do:

'reference auth_user'

The former syntax just allows for cases where you don't want to hard-code 
the name of the user table into your field definition (in case you decide 
to change it at some point). The problem with your original field 
definition was that you specified the field object itself (i.e., 
auth.settings.table_user), which requires that the table already exists. 
The "reference" syntax just requires the table name, not the table object.

Anthony

On Thursday, April 18, 2013 8:25:50 AM UTC-4, Loïc wrote:
>
> One more question Anthony,
> If I have other tables which reference themselves like :
>
> db.define_table('mytable',Field('myfield','string'))
> db.define_table('my_other_table',Field('myTable','reference mytable'))
>
> should I replace the* 'reference mytable' *statement with* 'reference %s' 
> % I_dont_know_what*' to be "lazy_tables compliant"?
> Thank you
>
> Le jeudi 18 avril 2013 13:59:18 UTC+2, Anthony a écrit :
>>
>> Have the auth tables been defined at that point. In any case, to avoid 
>> pre-mature table definition, try replacing auth.settings.table_user with:
>>
>> 'reference %s' % auth.settings.table_user_name
>>
>> Anthony
>>
>> On Thursday, April 18, 2013 7:51:19 AM UTC-4, Loïc wrote:
>>>
>>> Hello All
>>>
>>> consider the example model file below :
>>>
>>> db = DAL('sqlite://storage.sqlite')
>>>
>>> signature = db.Table(db,'auth_signature',
>>>       Field('created_on','datetime',default=request.now,
>>>             writable=False,readable=False, label=T('Created on')),
>>>         Field('created_by',auth.settings.table_user,default=auth.user_id
>>> ,
>>>             writable=False,readable=False, label=T('Created by')),
>>>         Field('modified_on','datetime',update=request.now,default=
>>> request.now,
>>>             writable=False,readable=False, label=T('Modified on')),
>>>       Field('modified_by',auth.settings.table_user,
>>>             default=auth.user_id,update=auth.user_id,
>>>             writable=False,readable=False, label=T('Modified by'))
>>>       )
>>>
>>> db._common_fields.append(signature)
>>>
>>> db.define_table('mytable',Field('myfield','string'))
>>> db.mytable.myfield.requires = IS_EMPTY_OR(IS_URL())
>>>
>>> Then, if I want to activate lazy_tables 
>>> db = DAL('sqlite://storage.sqlite', lazy_tables=True)
>>>
>>> I got the following error that I don't really understand.
>>> Can anyone explain me?
>>> Thank you 
>>>
>>> Error ticket for "test" Ticket ID 
>>>
>>> 127.0.0.1.2013-04-18.13-47-51.4d08ccf5-8d25-4cf1-a8dd-081d76046b7a
>>> <type 'exceptions.AttributeError'> 'NoneType' object has no attribute 
>>> 'startswith' Version  web2py™ Version 
>>> 2.4.5-stable+timestamp.2013.03.18.22.46.22  Python Python 2.7.3: 
>>> C:\Python27\python.exe (prefix: C:\Python27)  Traceback 
>>>
>>> 1.
>>> 2.
>>> 3.
>>> 4.
>>> 5.
>>> 6.
>>> 7.
>>> 8.
>>> 9.
>>> 10.
>>> 11.
>>> 12.
>>> 13.
>>>
>>> Traceback (most recent call last):
>>>   File "C:\Users\MCR\Google Drive\loic\web2py\web2py\gluon\restricted.py", 
>>> line 212, in restricted
>>>     exec ccode in environment
>>>   File "C:/Users/MCR/Google 
>>> Drive/loic/web2py/web2py/applications/test/models/db.py" 
>>> <http://127.0.0.1:8000/admin/default/edit/test/models/db.py>, line 101, in 
>>> <module>
>>>     db.mytable.myfield.requires = IS_EMPTY_OR(IS_URL())
>>>   File "C:\Users\MCR\Google Drive\loic\web2py\web2py\gluon\dal.py", line 
>>> 7790, in __getattr__
>>>     return self.lazy_define_table(tablename,*fields,**args)
>>>   File "C:\Users\MCR\Google Drive\loic\web2py\web2py\gluon\dal.py", line 
>>> 7714, in lazy_define_table
>>>     polymodel=polymodel)
>>>   File "C:\Users\MCR\Google Drive\loic\web2py\web2py\gluon\dal.py", line 
>>> 776, in create_table
>>>     elif field_type.startswith('reference'):
>>> AttributeError: 'NoneType' object has no attribute 'startswith'
>>>
>>>
>>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to