I think the format argument only alters the record representation in forms 
and SQLTABLE (which is used when a set or records is serialized in a view). 
If you're just doing a query and pulling an individual field value from a 
row, I don't think the format will be applied. See 
http://web2py.com/book/default/chapter/06#Record-Representation.

If you don't want to call the format function every time you display the 
speaker name, maybe you could use a virtual field: 
http://web2py.com/book/default/chapter/06#Virtual-Fields
Anthony

On Thursday, March 31, 2011 4:41:40 PM UTC-4, Gregory Hellings wrote:

> I have defined a custom auth.settings.table_user_name implementation 
> that includes one extra field and specifies a value for the format 
> argument.  In this case format is a callback function which displays 
> the user's name with extra formatting based on membership in certain 
> auth groups.  This option works wonderfully with SQLFORM fields and 
> with appadmin displays of the auth_membership table, but I seem to be 
> missing something about its functionality elsewhere. 
>
> (This is in the context of a demo chat application utilizing the 
> web2py_comet functionality). I have another table which is defined 
> like this: 
>
> db.define_table('chat', 
>     Field('speaker', db.auth_user, default=auth.user_id, 
> writable=False, readable=False), 
>     Field('statement', 'text', requires=IS_NOT_EMPTY()), 
>     Field('deleted', db.auth_user, writable=False, readable=False)) 
> db.chat.speaker.requires = IS_IN_DB(db, db.auth_user.id) 
> db.chat.deleted.requires  = IS_IN_DB(db, db,auth_user.id) 
>
> My controller for displaying the lines uses this logic 
>
> rawlines=db(db.chat.deleted==None).select(limitby=(0,10),orderby=~
> db.chat.id) 
> lines=[] 
> for line in rawlines: 
>     lines.append(DIV(line.speaker, B("> "), line.statement, 
> _id=line.id)) 
>
> However, when I do that, I get the user's ID instead of the user's 
> name as formatted by my format callback method.  Thus the chat output 
> looks like 
>
> 1> Hi there 
> 1> How is everyone doing? 
> 2> We're great, how about you? 
> 1> Oh, I'm absolutely fantastic. 
>
> In order to get the properly formatted user's name, I have to 
> explicitly call my format method, making the last line of the above 
> controller instead read 
>
>     lines.append(DIV(name_format(line.speaker), B("> "), 
> line.statement, _id=line.id)) 
>
> This defeats most of the purpose I had in using the automatic 
> format=name_format argument to the define_table call.  Am I missing 
> something here?  What am I doing incorrectly?  As I scale out of my 
> demo chatroom, I want to make sure user names are consistently 
> displayed throughout my application by means of the format argument to 
> the auth_user table, rather than trying to remember to call 
> name_format(user) everywhere.  Any advice? 
>
> --Greg

Reply via email to