[Zope] Why is it so hard to do simple things?
Chris McDonough
chrism@zope.com
Tue, 07 May 2002 23:44:52 -0400
Whoops. I had it wrong last time around. One more time, with feeling:
<dtml-let button_value="REQUEST.get('perm_or_temp', 'P')">
<INPUT TYPE='RADIO'
NAME=perm_or_temp
VALUE="P"
<dtml-if "button-value=='P'">
CHECKED</dtml-if>
> Permanent
<INPUT TYPE='RADIO'
NAME=perm_or_temp
VALUE="T"
<dtml-if "button-value=='T'>
CHECKED</dtml-if>
> Temporary
</dtml-let>
.. or ..
button_value = context.REQUEST.get('perm_or_temp', 'P')
possible = {'P':'Persistent','T':'Temporary'}
items = possible.items()
items.sort()
for key, value in items:
checked = (key == button_value) and ' CHECKED' or ''
print ("<input type=radio name=perm_or_temp VALUE='%s'%s> %s" %
(key, checked, value))
return printed
.. and a bonus alternate DTML implementation mirroring the Python one ..
<dtml-let button_value="REQUEST.get('perm_or_temp', 'P')"
possible="{'P':'Persistent','T':'Temporary'}"
items="possible.items()">
<dtml-call "items.sort()">
<dtml-in items>
<dtml-let "checked = (_[sequence-key] == button_value) and '
CHECKED' or ''>
<INPUT TYPE='RADIO'
NAME=perm_or_temp
VALUE="<dtml-var sequence-key>"
<dtml-var checked>> <dtml-var sequence-item>
</dtml-let>
</dtml-in>
</dtml-let>
Chris McDonough wrote:
> John Adams wrote:
>
>> If I was doing this in perl it'd be quite easy; I could check the query
>> variable, and act on it -- but now I have to deal with things like not
>> being able to even examine the variable without throwing an exception,
>> and
>> the fact that Python doesn't short-circuit blows.
>>
>> i.e. You can't examine something like:
>>
>> if (hasattr(request,'perm_or_temp') and request.perm_or_temp == 'P')
>
>
> Python does indeed short-circuit this statement and it will work as you
> seem to expect. Have you tried it?
>
> In DTML, here is something that will do what I think you want.
>
> <dtml-let button_value="REQUEST.get('perm_or_temp')">
> <INPUT TYPE='RADIO'
> NAME=perm_or_temp
> VALUE="P"
> <dtml-if "button-value=='P' or button_value==None">
> CHECKED</dtml-if>
> > Permanent
> <INPUT TYPE='RADIO'
> NAME=perm_or_temp
> VALUE="T"
> <dtml-if "button-value=='T'>
> CHECKED</dtml-if>
> > Temporary
> </dtml-let>
>
> There's a million variations on this, some better than others. In
> Python one way to do this would be as:
>
> button_value = context.REQUEST.get('perm_or_temp')
> checked_button = {None: 'P', 'P':'P', 'T':'T'}.get(button_value)
> for value in ['P', 'T']:
> checked = (value == checked_button) and ' CHECKED' or ''
> print ("<input type=radio name=perm_or_temp VALUE='%s'%s>" %
> (value, checked))
> return printed
>
> You could do something similar to this in DTML if you wanted as well.
> Since there are only a couple of possible values, it's probably easier
> just to spell it all out in this case.
>
> I'd suggest picking up the "Learning Python" O'Reilly book to learn
> basic idioms like this. The thing you were missing was that
> dictionary-like objects (of which REQUEST is one) have a get method that
> returns None if nothing of that key exists in the dictionary on a lookup.
>
--
Chris McDonough Zope Corporation
http://www.zope.org http://www.zope.com
"Killing hundreds of birds with thousands of stones"