On Nov 5, 2010, at 12:11 PM, villas wrote:
>
> @Jonathan
> I think you are right about the /<function>/<table>/<id> convention
> for SQLTABLE linkto.
> But by using linkto=URL() I should be able specify whichever URL I
> want rather than have to work around an unnecessary convention?
Probably not, at least not the way I read SQLTABLE. I'm not certain, but I
think that in your example, this is the way SQLTABLE is generating the href:
href = '%s/%s/%s' % (linkto, tablename, r_old)
Since linkto is the result of URL(), it'll have the function name, and the
above logic is always appending the table name to it (r_old is, I assume, the
id, but maybe not).
That line of code is part of this:
elif linkto and field.type == 'id':
try:
href = linkto(r, 'table', tablename)
except TypeError:
href = '%s/%s/%s' % (linkto, tablename, r_old)
r = A(r, _href=href)
(I'm not 100% sure how r gets built, but as you see it's the link text, so you
should be able to look and see what it is.)
It looks like you can make linkto a lambda function, in which case you'll have
complete control over the href.
>
> @Richard
> I played around a little, but I couldn't make that work for me, but
> maybe I'm missing something.
>
> On Nov 5, 6:33 pm, Jonathan Lundell <[email protected]> wrote:
>> On Nov 5, 2010, at 11:00 AM, villas wrote:
>>
>>
>>
>>> Does SQLTABLE linkto work properly?
>>
>>> If I use:
>>> SQLTABLE(mytablerows,linkto=URL())
>>
>>> I get URLs like this: myapp/default/mytable/mytable/id
>>
>>> Note the duplication of "mytable".
>>
>> I wonder if this is really a "duplication". As web2py interprets a URL, the
>> first mytable is a function name, and the second (in this case) is a table
>> name, right? They happen to have the same name here.
>>
>> (That said, SQLTABLE's linkto logic is distinctly non-trivial; I'm not at
>> all sure what's going on in several of the cases.)
>>
>>> I have tried with URL('mytable') and URL(f='mytable'), but it's the
>>> same.
>>
>>> Of course I can work around the issue specifying:
>>> db.mytable.id.represent = lambda id:
>>> A('edit:',id,_href=URL(args=(id)))
>>
>>> ...which gives the URL that I expect, but that is not the question
>>> here...
>>
>>> --D
>>
>>