<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Brief question, followed by a winding (but fruitless) road of
self-discovery...<br>
<br>
If you specify a DisplayList as the Vocabulary for an AT Field called
building:<br>
<br>
<font face="Courier New">BUILDING = DisplayList((<br>
&nbsp;&nbsp;&nbsp; ('bank-of-america',&nbsp;&nbsp; 'Bank of America'),<br>
&nbsp;&nbsp;&nbsp; ('lineberger',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Lineberger'),<br>
&nbsp;&nbsp;&nbsp; ('mary-ellen-jones',&nbsp; 'Mary Ellen Jones'),<br>
&nbsp;&nbsp;&nbsp; ('macnider',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Macnider'),<br>
&nbsp;&nbsp;&nbsp; ('mbrb',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Medical Biomolecular Research Building'),<br>
&nbsp;&nbsp;&nbsp; ('other',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Other'),<br>
&nbsp;&nbsp;&nbsp; ))</font><br>
<br>
...And you use the default accessor getBuilding in your page template,
it will display the id ('mbrb' instead of 'Medical Biomolecular
Research Building').&nbsp; How do you get the getBuilding accessor to show
the "value" instead of the "key"?<br>
<br>
~~~~~~~~~~<br>
I'm thinking the right way to go is to overwrite the getBuilding
accessor, but this seems like something that should be built in
already.&nbsp; So I went to portal_skins/archetypes/base_view to see how it
worked.&nbsp; Then went to portal_skins/archetypes/widgets/selection to see
specifically how the selection widget worked. the key lines seem to be:
<pre>tal:define="vocab python:field.Vocabulary(here) 
and 
tal:content="python:here.translate(vocab.getMsgId(item), default=vocab.getValue(item))"

</pre>
Of course, this isn't actually returning the dictionary value, just the
id.&nbsp; Is there something besides getMsgId I should use?&nbsp; The reference
for Field didn't really clue me in. Thanks for any advice on the
answer, or a better way to find the answer.<br>
<br>
<h3><span class="sig"><span class="sig-name"><b
 style="color: black; background-color: rgb(160, 255, 255);">Vocabulary</b></span>(<span
 class="sig-arg">self</span>, <span class="sig-arg">content_instance</span>=<span
 class="sig-default">None</span>)</span> </h3>
<pre class="literalblock">Returns a <b
 style="color: black; background-color: rgb(255, 255, 102);">DisplayList</b>.

Uses self.<b style="color: black; background-color: rgb(160, 255, 255);">vocabulary</b> as source.

1) Static <b style="color: black; background-color: rgb(160, 255, 255);">vocabulary

</b>   - is already a <b
 style="color: black; background-color: rgb(255, 255, 102);">DisplayList
</b>   - is a list of 2-tuples with strings (see above)
   - is a list of strings (in this case a <b
 style="color: black; background-color: rgb(255, 255, 102);">DisplayList
</b>     with key=value will be created)

2) Dynamic <b
 style="color: black; background-color: rgb(160, 255, 255);">vocabulary</b>:

   - precondition: a content_instance is given.

   - has to return a:

        * <b style="color: black; background-color: rgb(255, 255, 102);">DisplayList</b> or
        * list of strings or
        * list of 2-tuples with strings:
            '[("key1","value 1"),("key 2","value 2"),]'

   - the output is postprocessed like a static <b
 style="color: black; background-color: rgb(160, 255, 255);">vocabulary</b>.

   - <b style="color: black; background-color: rgb(160, 255, 255);">vocabulary</b> is a string:
        if a method with the name of the string exists it will be called

   - <b style="color: black; background-color: rgb(160, 255, 255);">vocabulary</b> is a class implementing IVocabulary:
        the "getDisplayList" method of the class will be called.
</pre>
<br>
<br>
<br>
<br>
</body>
</html>