<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6701318137774273286</id><updated>2011-11-28T04:28:55.522+04:00</updated><category term='z3c'/><category term='z3c-tutorial'/><category term='музыка'/><category term='zope'/><category term='тест'/><title type='text'>Просто блог</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-1996878777192987549</id><published>2008-10-13T15:12:00.000+04:00</published><updated>2008-10-13T15:17:30.060+04:00</updated><title type='text'>Полезно быть программистом</title><content type='html'>Друган играется в подкидного дурака онлайн. Но карты не запоминает, а отмечает, какие карты ушли в бито. Программа называется &lt;a href="http://penzalife.info/eto-polezno/programms/card-helper/"&gt;Card Helper - помощник игры в дурака&lt;/a&gt;. Доступна она бесплатно. Программа простенькая, но очень полезная.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-1996878777192987549?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/1996878777192987549/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=1996878777192987549' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/1996878777192987549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/1996878777192987549'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/10/blog-post.html' title='Полезно быть программистом'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-8968385050133877635</id><published>2008-04-23T10:33:00.000+04:00</published><updated>2008-12-10T15:12:17.858+03:00</updated><title type='text'>z3c tutorial, часть третья</title><content type='html'>&lt;span style="font-weight: bold;font-size:180%;" &gt;3 Создание форм при помощи z3c.form&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;По логике, следующим шагом для ZContact была бы возможность добавлять контакты, через форму, которая спрашивала бы у нас имя и фамилию нового контакта. Мы можем генерировать такую форму с помощью schema (IContact), определенную нами в interfaces.py с использованием пакета z3c.form&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.1 Добавление z3c.form и z3c.formui в качестве зависимостей&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Однако, прежде чем мы сможем использовать z3c.form, мы должны добавить ее в качестве зависимости к нашему приложению.&lt;br /&gt;&lt;br /&gt;Чтобы добавить z3c.form как зависимость, откройте setup.py в корневой директории вашего приложения и добавьте 'z3.form' параметру install_requires (где-то возле 25 линии :). В это время вам следует также добавить z3c.formui и  z3c.layer в качестве зависимостей, которые необходимы для отрисовки в клевой верстке.&lt;br /&gt;&lt;br /&gt;Следующее, что вы захотите, это включить zcml-конфигурацию для z3c.form и z3c.formui в файл configure.zcml, расположенный в zcontact/src/configure.zcml. z3c.form makes use (делает применение?) другие многочисленные компоненты z3c.*, которые определяют новые zcml-директивы.&lt;br /&gt;&lt;br /&gt;Для использования этих директив вы должны включить метафайлы в начало файла сonfigure.zcml &lt;span style="font-style: italic;"&gt;перед всеми другими инклюдами (include)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Tt0FLQYa9Jg/SBBFO4tnpYI/AAAAAAAAABc/DB9XVQ1ziiE/s1600-h/1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Tt0FLQYa9Jg/SBBFO4tnpYI/AAAAAAAAABc/DB9XVQ1ziiE/s400/1.jpg" alt="" id="BLOGGER_PHOTO_ID_5192726492402394498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Следующее, что вам нужно, это включить реально (?) пакеты z3c.form и z3c.formui в конец конфигурационного файла configure.zcml.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Tt0FLQYa9Jg/SBBFPYtnpZI/AAAAAAAAABk/bD1nNa-CLmw/s1600-h/2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Tt0FLQYa9Jg/SBBFPYtnpZI/AAAAAAAAABk/bD1nNa-CLmw/s400/2.jpg" alt="" id="BLOGGER_PHOTO_ID_5192726500992329106" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Теперь все, что мы должны сделать, это перезапустить процесс сборки, чтобы загрузились и стали доступны новые яйца-капсулы для z3c.form и z3c.formui.&lt;br /&gt;&lt;br /&gt;&lt;pre class="literal-block"&gt;$ ./bin/buildout -N&lt;br /&gt;&lt;/pre&gt; Опция -N указана для того, чтобы не загружались уже скачанные яйца (настоятельно рекомендуется).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.2 Настройка вашего приложения для работы с z3c.form&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;К сожалению, мы еще не совсем готовы к использованию z3c.form. Из-за того, что пакеты z3c созданы с неким другим шаблоном для создания приложений, необходимы ее кое-какие шаги, чтобы заставить их работать. Одним из таких шагов будет установка своего собственного слоя и скина. К несчастью, многие zcml-директивы не помогут вам объяснить, для какого слоя вам необходимо зарегистрировать страницу или вид. Если вы не укажете слой, он регистрируется со слоем по-умолчанию. Это отключит все те пакеты, которые зарегистрировали все свои собственные виды со слоем по-умолчанию, делая этот слой сильно загрязненным всяким ненужным нам барахлом. Избежать этого непотребства, пакеты z3c.* регистрируют все свои виды по запросу на слое, специфичному (?) пакету. Чтобы правильно использовать z3c.* пакет, вы должны расширить эти слои со своим собственным. Сейчас мы создадим слой, который позволит нам использовать виды из пакета z3c.form.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;3.2.1 Создание слоя&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Создайте новый файл src/zcontact/layer.py и добавьте в него следующий код:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.form.interfaces&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; IFormLayer&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.layer.pagelet&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; IPageletBrowserLayer&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;IZContactBrowserLayer&lt;/span&gt;(IFormLayer, IPageletBrowserLayer):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;    """ZContact browser layer with form support."""&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&lt;/span&gt;&lt;/tt&gt;&lt;br /&gt;IFormLayer имеет виды для всех виджетов, используемых в генерируемых формах, а IPageletBrowserLayer предоставляет различные полезные виды утилит, таких как error.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;3.2.2 Создание скина&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Чтобы получить доступ к этому слою из браузера, мы должны создать скин. Итак, создадим еще один файл src/zcontact/skin.py и добавьте туда следующий код:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.formui.interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zcontact&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; layer&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;IZContactBrowserSkin&lt;/span&gt;(z3c&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;formui&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IDivFormLayer,&lt;br /&gt; layer&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IZContactBrowserLayer):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;     """The ZContact browser skin using the div-based layout."""&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Заметьте, что наш скин наследуется от IDivFormLayer, определенный в пакете z3c.formui. Когда форма отрендерится, поля возникнут в тегах, а не в таблице. Существует еще слой для верстки, основанной на таблицах. Благодаря компонентной архитектуре, также возможно написать свой собственный слой верстки форм, но мы не будем здесь этого делать. :)&lt;br /&gt;Сейчас мы должны зарегистрировать скин в zcml с новым файлом src/zcontact/skin.zcml. Мы сделаем доступным наш скин через &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/"&gt;http://localhost:8080/++skin++ZContact/&lt;/a&gt;. В файле будет следующее:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Tt0FLQYa9Jg/SBBF84tnpaI/AAAAAAAAABs/e94A74U1g5c/s1600-h/3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Tt0FLQYa9Jg/SBBF84tnpaI/AAAAAAAAABs/e94A74U1g5c/s400/3.jpg" alt="" id="BLOGGER_PHOTO_ID_5192727282676376994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Не забудьте включить этот новый zcml-файл в zcontact/configure.zcml линией &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&lt;include&gt;&lt;/include&gt;&lt;/span&gt; &lt;span class="pre"&gt;package="zcontact"&lt;/span&gt; &lt;span class="pre"&gt;file="skin.zcml"&lt;/span&gt; &lt;span class="pre"&gt;/&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/tt&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.3 Создание формы добавления&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Мы начнем создание нового модуля zcontact.browser, добавив директорию browser в src/zcontact с пустым файлом __init__.py. Теперь мы можем создать и открыть новый файл zcontact/browser/contact.py, где мы определим все формы.&lt;br /&gt;Начнем с добавления следующего кода в файл browser/contact.py:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.form&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; form, field&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zcontact&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; interfaces&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;ContactAddForm&lt;/span&gt;(form&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;AddForm):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;   """A simple add form for contacts."""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;fields &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; field&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Fields(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Класс form.AddForm, от которого мы сейчас унаследовались, определяет для создания и добавления наших новых объектов несколько методов, которые мы переопределим позднее и на форме добавления можно найти несколько кнопок.&lt;br /&gt;Затем мы добавим страницу, которая использует этот класс для отображения ормы. Откройте zcontact/browser/configure.zcml и добавьте следующее:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&lt;configure&gt;&lt;/configure&gt;&lt;/span&gt; &lt;span style="color: rgb(125, 144, 41);"&gt;xmlns=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"http://namespaces.zope.org/browser"&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&lt;page&gt;&lt;/page&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"addContact.html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;for=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zope.app.folder.interfaces.IFolder"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;permission=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zope.Public"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;layer=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zcontact.layer.IZContactBrowserLayer"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;".contact.ContactAddForm"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;/&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Мы зарегистрировали страницу под именем addContact.html для интерфейса IFolder. Поскольку корневая папка каждого нового экземпляра zope реализует IFolder, мы должны иметь возможность (сможем) получить доступ к этой странице по адресу  &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/@@addContact.html"&gt;http://localhost:8080/++skin++ZContact/@@addContact.html&lt;/a&gt;. Не забудьте включить пакет browser в файл zcontact/configure.zcml, добавив в самый конец строчку &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;&lt;include&gt;&lt;/include&gt;&lt;/span&gt; &lt;span class="pre"&gt;package=".browser"&lt;/span&gt; &lt;span class="pre"&gt;/&gt;&lt;/span&gt;&lt;/tt&gt;.&lt;br /&gt;Теперь мы готовы к действию, итак, перезапустим сервер с помощью команды &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;./bin/paster&lt;/span&gt; &lt;span class="pre"&gt;serve&lt;/span&gt; &lt;span class="pre"&gt;deploy.ini&lt;/span&gt;&lt;/tt&gt; (или &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;debug.ini&lt;/span&gt;&lt;/tt&gt;, если пожелаете) и зайдем по адресу  &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/@@addContact.html"&gt;http://localhost:8080/++skin++ZContact/@@addContact.html&lt;/a&gt;. Вы должны увидеть очень простую форму по типу:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/addFormSimple.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;3.4 Доводим до конца форму добавления&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Если вы действительно попробовалииспользовать форму добавления и нажимали на кнопку, вы должны были получить ошибку NotImplemented. Если вы выбирали запуск paster с конфигурацией debug.ini, а не deploy.ini, вероятно вы получали клевый (прикольный) экран по типу следующего:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/serverError.png" /&gt;&lt;br /&gt;&lt;br /&gt;Из этово экрана вы можете раскрыть любую строчку в трассировке и вставить туда код python, чтобы отладить проблему. Я был очень удивлен (и я тоже, - прим. переводчика), когда впервые увидел это.&lt;br /&gt;Чтобы исправить ошибку, мы должны реализовать три метода для класса ContactAddForm: create, add и nextURL. Я решил реализовать то по-быстрому, как показано ниже, хотя, конечно, никто не мешает вам сделать это по-своему.&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt; 1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;br /&gt;14&lt;br /&gt;15&lt;br /&gt;16&lt;br /&gt;17&lt;br /&gt;18&lt;br /&gt;19&lt;br /&gt;20&lt;br /&gt;21&lt;br /&gt;22&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.form&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; form, field&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zcontact&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; interfaces&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zcontact.contact&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; Contact&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;ContactAddForm&lt;/span&gt;(form&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;AddForm):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;"""A simple add form for contacts."""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;fields &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; field&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Fields(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;create&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, data):&lt;br /&gt;contact &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; Contact()&lt;br /&gt;form&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;applyChanges(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, contact, data)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;return&lt;/span&gt; contact&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;add&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, contact):&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;_name &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(186, 33, 33);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(187, 102, 136); font-weight: bold;"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(187, 102, 136); font-weight: bold;"&gt;%s&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;%&lt;/span&gt; (contact&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;lastName&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;lower(), contact&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;firstName&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;lower())&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context[&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;_name] &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; contact&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;nextURL&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;):&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: rgb(186, 33, 33);"&gt;'/'&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;В методе create мы использовали функцию form.applyChanges для установки значений атрибутов нового контакта firstName и lastName. Данные, передаваемые методу create соотносятся между именами полей и введенными данными, уже приведенными к правильным типам python. Например, мы должны получить  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;contact.firstName&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;data['firstName']&lt;/span&gt;&lt;/tt&gt;. Я жестко установил методу nextURL возвращать путь, который отправлял бы нас назад к скину по-умолчанию Rotterdam, где вы сможете увидеть заново созданный контакт в виде содержимого. Мы сделали это, так как еще не написали свой собственные контентные виды для нашего слоя/скина и должны возвращаться в Rotterdam.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.5 Формы отображения и редактирования&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Формы отображения и редактирования еще проще, чем формы добавления, тк как вам не нужно реализовывать дополнительные методы. Давайте начнем с создания такой формы отображения.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.5.1 Создание формы отображения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Для создания формы отображения нам понадобится новый класс, который бы наследовался от form.Form. Чтобы виджет отображался как обычный текст, а не форма ввода, мы должны установить для формы режим DISPLAY_MODE, это обычная константа, которую нужно импортировать из z3c.form.interfaces, (добавив строку импорта from z3c.form.interfaces import DISPLAY_MODE - прим. переводчика). Откройте файл zcontact/browser/contact.py и добавьте следующий код:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;ContactDisplayForm&lt;/span&gt;(form&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Form):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;"""A simple display form for contacts."""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;fields &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; field&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Fields(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact)&lt;br /&gt;mode &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; DISPLAY_MODE&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;и не забудьте зарегистрировать новую форму в configure.zcml (не который корневой, а который в папке browser - прим. переводчика) с помощью следующего:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&lt;page&gt;&lt;/page&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"index.html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;for=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"..interfaces.IContact"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;permission=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zope.Public"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;layer=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zcontact.layer.IZContactBrowserLayer"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;".contact.ContactDisplayForm"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Сейчас, когда у нас есть форма отображения, мы можем изменить nextURL класса ContactAddForm, чтобы он указывал на вновь созданный контакт. Теперь он будет выглядеть следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;nextURL&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;):&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;return&lt;/span&gt; absoluteURL(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context[&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;_name], &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Не забудьте включить линию  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;zope.traversing.browser.absoluteurl&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;absoluteURL&lt;/span&gt;&lt;/tt&gt;  в начало файла! Если все получилось, вы можете рестартовать сервер и добавить новый контакт по адресу  &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/@@addContact.html"&gt;http://localhost:8080/++skin++ZContact/@@addContact.html&lt;/a&gt;, чтобы открыть форму отображения. Она будет выглядеть примерно так:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/DisplayFormScreenShot.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.5.2 Добавление кнопок в форму&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;А теперь давайте-ка добавим две кнопочки, одну для редактирования, другую для удаления контакта. Начнем с добавления строчки  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;z3c.form&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;button&lt;/span&gt;&lt;/tt&gt; в начало файла contact.py.&lt;br /&gt;&lt;br /&gt;Когда пользователь нажимает кнопку, данные формы отправляются по адресу url, указанному в атрибуте action формы. По-умолчанию, action установлено в url самой формы, так что, когда нажимаем кнопку, порма просто перезагружается. Когда форма отрабатывается, проверяется, какая кнопка была нажата и вызываются соответствующие обработчики (handlers), которые определены как методы в классе ContactDisplayForm. Кроме того, при помощи z3c.form мы можем определить кнопку и обработчик, используя декоратор. Для кнопки удаления мы заходим удалить контакт и отправить пользователя назад на форму добавления. Добавим следующий код в класс ContactDisplayForm:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(170, 34, 255);"&gt;@button&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;buttonAndHandler(&lt;span style="color: rgb(186, 33, 33);"&gt;u'Delete'&lt;/span&gt;, name&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;'delete'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;handleDelete&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, action):&lt;br /&gt;name &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; getName(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context)&lt;br /&gt;parent &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; getParent(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;del&lt;/span&gt; parent[name]&lt;br /&gt;nextURL &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; absoluteURL(parent, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request)&lt;span style="color: rgb(102, 102, 102);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;'/@@addContact.html'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;response&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;redirect(nextURL)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Убедитесь, что вы добавили следующие строчки импорта в начало файла:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.form&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; form, field, button&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;z3c.form.interfaces&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; DISPLAY_MODE&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.traversing.browser.absoluteurl&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; absoluteURL&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.traversing.api&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; getParent, getName&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;(А у меня еще была строчка from zcontact.contact import Contact, может она не нужна?&lt;br /&gt;&lt;br /&gt;Действительно, если ее упустить, то в дебаг-мод можно увидеть трейссинг следующего вида:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SA9JqYtnpUI/AAAAAAAAAA8/XP7QyVJleQI/s1600-h/errorContact.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SA9JqYtnpUI/AAAAAAAAAA8/XP7QyVJleQI/s320/errorContact.jpg" alt="" id="BLOGGER_PHOTO_ID_5192449887918597442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;А еще конечно же не забываем про from zcontact import interfaces. Таким образом, у нас будет наверху следующий импорт:&lt;br /&gt;&lt;br /&gt;from zope.traversing.browser.absoluteurl import absoluteURL&lt;br /&gt;from z3c.form import form, field, button&lt;br /&gt;from z3c.form.interfaces import DISPLAY_MODE&lt;br /&gt;from zcontact import interfaces&lt;br /&gt;from zcontact.contact import Contact&lt;br /&gt;from zope.traversing.api import getParent, getName&lt;br /&gt;&lt;br /&gt;Так что смотрим внимательно за тем, что делаем! - прим. переводчика)&lt;br /&gt;&lt;br /&gt;Теперь добавим кнопку редактирования. У нас еще нет пока формы редактирования, так что кнопка редактирования будет вести нас на несуществующую страницу. Пока просто забьем место этим. Добавьте следующее в класс ContactDisplayForm:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(170, 34, 255);"&gt;@button&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;buttonAndHandler(&lt;span style="color: rgb(186, 33, 33);"&gt;u'Edit'&lt;/span&gt;, name&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"edit"&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;handleEdit&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, action):&lt;br /&gt;nextURL &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; absoluteURL(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request) &lt;span style="color: rgb(102, 102, 102);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(186, 33, 33);"&gt;'/@@editContact.html'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;response&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;redirect(nextURL)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Теперь вы можете рестартовать сервер и попробовать кнопки (Зайдите по адресу &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/@@addContact.html"&gt;http://localhost:8080/++skin++ZContact/@@addContact.html&lt;/a&gt;, добавьте контакт и полюбуйтесь - прим. переводчика). Ваша форма будет похожа на следующую:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/DisplayFormButtonScreenShot.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.5.3 Создание форм для редактирования&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;К этому времени вы должны быть близки к уровню профи в деле автогенерируемых форм. Нашим финальным аккордом будет создание формы редактирования, которая самая простенькая из всех. Вот код, который вам нужно добавить:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;ContactEditForm&lt;/span&gt;(form&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;EditForm):&lt;br /&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;"""A simple edit form for contacts."""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;fields &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; field&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Fields(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;и всего-то еще необходимую zcml-конфигурацию:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;&lt;page&gt;&lt;/page&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;name=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"editContact.html"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;for=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"..interfaces.IContact"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;permission=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zope.Public"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;layer=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;"zcontact.layer.IZContactBrowserLayer"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(125, 144, 41);"&gt;class=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;".contact.ContactEditForm"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;/&gt;&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Теперь возьмем и попробуем нашу форму для редактирования, нажав кнопку Edit с формы отображения (то есть сначала, конечно, нужно зайти по адресу  &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/@@addContact.html"&gt;http://localhost:8080/++skin++ZContact/@@addContact.html&lt;/a&gt; и добавить контакт, а потом с формы отображения нажать на Edit - прим. переводчика). Вы можете заметить, что мы уже имеем кнопку Apply для внесения изменений. После редактирования вам представят статусное сообщение об успехе или провале. С этого момента, мы вернемся к форме добавления и добавим кнопку 'Done' в класс ContactEditForm с помощью кода:&lt;br /&gt;&lt;br /&gt;&lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(170, 34, 255);"&gt;@button&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;buttonAndHandler(&lt;span style="color: rgb(186, 33, 33);"&gt;u'Done'&lt;/span&gt;, name&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;'done'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;def&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;handleDone&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;, action):&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;response&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;redirect(absoluteURL(&lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;context, &lt;span style="color: rgb(0, 128, 0);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;request))&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Но постойте! Как только мы создали свою собственную кнопку, мы переопределили кнопки, декларируемые в классе form.EditForm. Чтобы избежать этого, мы должны расширить (extend) класс form.EditForm, поместив form.extends (form.EditForm) после декларации класса ContactEditForm. Теперь вы должны иметь форму для редактирования по типу следующей:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/EditFormScreenShot.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;3.6 Завершение приложения заглавной страницей&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Прежде чем мы ринемся в скиннинг, давайте сделаем еще одну страницу для целостности нашего приложения. Следующая страница будет заглавной страницей нашего приложения и будет предоставлять ссылку на форму добавления и ссылки на каждый существующий контакт. Это все можно сделать в простом шаблоне в zcontact/browser/frontpage.pt&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SBBAXItnpWI/AAAAAAAAABM/QaT0aoJWv-Y/s1600-h/frontpage.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SBBAXItnpWI/AAAAAAAAABM/QaT0aoJWv-Y/s400/frontpage.jpg" alt="" id="BLOGGER_PHOTO_ID_5192721136578176354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Чтобы это появилось в главной странице нашего приложения, нам нужно зарегистрировать страницу в zcml для интерфейса IRootFolder. Добавим следующее в файл zcontact/browser/configure.zcml:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Tt0FLQYa9Jg/SBBAoYtnpXI/AAAAAAAAABU/5wYf_vdYXmo/s1600-h/conf_zcml.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_Tt0FLQYa9Jg/SBBAoYtnpXI/AAAAAAAAABU/5wYf_vdYXmo/s400/conf_zcml.jpg" alt="" id="BLOGGER_PHOTO_ID_5192721432930919794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Перезагрузите ваш сервер и проверьте &lt;a class="reference" href="http://localhost:8080/++skin++ZContact/"&gt;http://localhost:8080/++skin++ZContact/&lt;/a&gt; и вы должны увидеть что-то похожее.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://docs.carduner.net/z3c-tutorial/images/FrontPageScreenShot.png" /&gt;&lt;br /&gt;&lt;br /&gt;Итак, с несколькими готовыми формами и сносно работающим приложеньицем, мы можем начать изучение других пакетов z3c.*.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-8968385050133877635?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/8968385050133877635/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=8968385050133877635' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/8968385050133877635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/8968385050133877635'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/04/z3c-tutorial_22.html' title='z3c tutorial, часть третья'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Tt0FLQYa9Jg/SBBFO4tnpYI/AAAAAAAAABc/DB9XVQ1ziiE/s72-c/1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-6680635092254169770</id><published>2008-04-16T14:51:00.000+04:00</published><updated>2008-12-10T15:12:18.217+03:00</updated><title type='text'>z3c-tutorial. 2 глава!</title><content type='html'>Это вторая глава переводимой мной документации z3c-tutorial, оригинал которой доступен по адресу &lt;a href="http://docs.carduner.net/z3c-tutorial"&gt;http://docs.carduner.net/z3c-tutorial&lt;/a&gt;. Итак, поехали!&lt;br /&gt;&lt;div class="section"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;&lt;br /&gt;2 Приступая к работе&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2.1 Установка виртуального окружения&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Прежде чем мы начнем работать над нашим приложением, хорошей идей будет настроить окружение питона, которое отделено от системного питона, предустановлого с каким-то используемым вами дистрибутивом linux (в моем случае это Ubuntu Gutsy) (А в моем это OpenSUSE 10.3 - прим. перев. :). Создав "виртуальную" среду питона, мы сможем избежать множества различных проблем, связанных с системным питоном, таких как: неработающие пакеты, конфликтующие зависимости и т.д.).&lt;br /&gt;&lt;br /&gt;Виртуальную среду питона можно легко создать с помощью скрипта &lt;span style="font-style: italic;"&gt;virtualenv.py&lt;/span&gt;, доступного по адресу: &lt;a href="http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py"&gt;http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py&lt;/a&gt;. Подробнее о том, что делает этот скрипт, можно почитать на странице pypi: &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;http://pypi.python.org/pypi/virtualenv&lt;/a&gt;.&lt;br /&gt;Загрузите этот скрипт в вашу домашнюю директорию и создайте новое окружение с именем sandbox:&lt;div class="section"&gt;&lt;blockquote&gt; &lt;/blockquote&gt;   &lt;pre class="literal-block"&gt;$ wget http://svn.colorstudy.com/virtualenv/trunk/virtualenv.py ~/&lt;br /&gt;$ python ~/virtualenv.py sandbox&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;В качестве альтернативы вы можете поместить эту среду в любое место, куда вам захочется, и назвать так, как вам нравится! Эта папка сейчас имеет директорию bin с новым исполняемым файлом python и скриптом easy_install. Еще там лежит bash-скрипт для помещения вашей оболочки в новую среду, так что вы не должны набирать полный путь для запуска питона из нашего окружения. Давайте-ка запустим это:&lt;br /&gt;&lt;/p&gt; &lt;pre class="literal-block"&gt;$ cd sandbox&lt;br /&gt;$ source bin/activate&lt;/pre&gt; &lt;p&gt;После этого мы можем убедиться в том, что это все работает:&lt;br /&gt;&lt;/p&gt; &lt;pre class="literal-block"&gt;(sandbox)$ which python&lt;br /&gt;/home/pcardune/sandbox/bin/python&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Начиная с этого момента, везде, где вы увидите запущенную shell-команду, подразумевается, что вы запустили виртуальное окружение. &lt;a class="toc-backref" href="http://docs.carduner.net/z3c-tutorial/#id7" id="using-zopeproject" name="using-zopeproject"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class="section"&gt; &lt;blockquote&gt; &lt;/blockquote&gt; &lt;p&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2.2 Использование zopeproject&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Было бы неплохо начать работу с простейшего каркаса приложения, так чтобы не нужно было беспокоиться о написании всей конфигурации с нуля. К счастью, для этого Philipp von Weitershausen уже написал замечательное средстов, названное &lt;a class="reference" href="http://pypi.python.org/pypi/zopeproject"&gt;zopeproject&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;zopeproject можно установить с помощью скрипта easy_install. Для этого просто наберите:&lt;/p&gt; &lt;pre class="literal-block"&gt;$ easy_install zopeproject&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Теперь создадим новый проект под названием zcontact. zopeproject создаст всю основную конфигурацию, которая вам понадобится для того, чтобы запустить пустое zope-приложение и войти под аккаунтом администратора. Вас попросят ввести имя и пароль к административному аккаунту (который можно будет изменить в любое время), а также расположение для установки необходимых компонентов.&lt;/p&gt;$ zopeproject zcontact&lt;br /&gt;&lt;pre class="literal-block"&gt;Enter user (Name of an initial administrator user): manager&lt;br /&gt;Enter passwd (Password for the initial administrator user): zcontact&lt;br /&gt;Enter eggs_dir (Location where zc.buildout will look for and place packages) ['/home/pcardune/buildout-eggs']: eggs&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;Этот шаг может занять несколько&lt;/p&gt;&lt;p&gt; минут, так как будет загружаться много кода и некоторый из них будет откомпилирован. Пока вы ждете, я настоятельно рекомендую поглядеть документацию по &lt;a class="reference" href="http://pypi.python.org/pypi/zopeproject"&gt;zopeproject&lt;/a&gt;, чтобы лучше понять, чего он там делает.&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;2.3 Запуск сервера&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Когда все будет завершено вы можете зайти прямо туда (а можно попрыгать сначала и поплясать драмак - прим. перев. :) и запустить ваше зарождающееся приложение, которое по умолчанию запустится на 8080 порту:&lt;/p&gt;&lt;/div&gt;&lt;div class="section"&gt;&lt;pre class="literal-block"&gt;$ cd zcontact&lt;br /&gt;$ ./bin/paster serve deploy.ini&lt;br /&gt;&lt;br /&gt;Starting server in PID 23818.&lt;br /&gt;serving on http://127.0.0.1:8080&lt;br /&gt;&lt;/pre&gt; &lt;p&gt;Сейчас вы должны получить пустой zope-экран, который выглядит примерно так:&lt;br /&gt;&lt;/p&gt; &lt;img alt="images/screen1.png" src="http://docs.carduner.net/z3c-tutorial/images/screen1.png" /&gt;  &lt;p&gt;Файл &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;deploy.ini&lt;/span&gt;&lt;/tt&gt;, передаваемый команде &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;./bin/paster, указывает опции для запускаемого сервера&lt;/span&gt;&lt;/tt&gt;, например, такие как настройки порта. zopeproject также генерирует файл debug.ini, который включает WSGI-фильтр для управления ошибками. Даже когда вы запустились с ошибками, вы можете использовать конфигурацию debug.ini для отслеживания кода, как он запускается, прямо в вашем браузере!&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;2.4 Регулировка настроек безопасности&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Чтобы упростить себе работу в этом руководстве, мы настроим права, генерируемые zopeproject'ом, так, чтобы нам не пришлось заботиться о них в дальнейшем. Добавим следующие строчки в файл site.zcml, который находится в корневой директории вашего приложения:&lt;/p&gt;&lt;pre class="literal-block"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Tt0FLQYa9Jg/SAX3lhAOseI/AAAAAAAAAAM/jnqf__50Oeo/s1600-h/lj0.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_Tt0FLQYa9Jg/SAX3lhAOseI/AAAAAAAAAAM/jnqf__50Oeo/s320/lj0.jpg" alt="" id="BLOGGER_PHOTO_ID_5189826369500918242" border="0" /&gt;&lt;/a&gt;&lt;/pre&gt;  &lt;/div&gt; &lt;div class="section"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Это даст полный доступ ко всему без ограничений анонимным пользователям.&lt;/p&gt;&lt;/div&gt;&lt;div class="section"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2.5 Создание простого интерфейса и реализации&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Перед тем как окунуться в мир пакетов z3c.*, мы должны иметь некий объект, с которым мы будем играться. Поскольку ZContact'у полагается быть менеджером контактов, давайте начнем с объекта контакт. Чтобы он был попроще, у нас будет всего два поля: имя и фамилия (first name и last name).&lt;br /&gt;&lt;div class="note"&gt;&lt;p class="first admonition-title"&gt;Примечание&lt;br /&gt;&lt;/p&gt; &lt;p class="last"&gt;Весь исходный код располагается в папке &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zcontact/src/zcontact&lt;/span&gt;&lt;/tt&gt;, так что &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zcontact/src/zcontact/interfaces.py&lt;/span&gt;&lt;/tt&gt; можно импортировать как &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;zcontact.interfaces&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;&lt;p style="font-weight: bold;" class="last"&gt;2.5.1. Интерфейс IContact&lt;/p&gt;&lt;/div&gt;&lt;div class="section"&gt;Откройте файл &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;interfaces.py&lt;/span&gt;&lt;/tt&gt; и добавьте следующее: &lt;table style="width: 392px; height: 225px;" class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;br /&gt;12&lt;br /&gt;13&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.interface&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.schema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;IContact&lt;/span&gt;(zope&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;interface&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;Interface):&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;"""A simple contact."""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;firstName &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; zope&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;schema&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;TextLine(&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;title&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;u"First Name"&lt;/span&gt;,&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;required&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;lastName &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; zope&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;schema&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;TextLine(&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;title&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33);"&gt;u"Last Name"&lt;/span&gt;,&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;required&lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;True&lt;/span&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-weight: bold;"&gt;2.5.2 Реализация Contact&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Теперь по-быстренькому мы можем сделать нашу реализацию. Откройте &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;contact.py&lt;/span&gt;&lt;/tt&gt; и добавьте следующее:&lt;/div&gt;&lt;div class="section"&gt; &lt;table class="highlighttable"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;pre&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;4&lt;br /&gt;5&lt;br /&gt;6&lt;br /&gt;7&lt;br /&gt;8&lt;br /&gt;9&lt;br /&gt;10&lt;br /&gt;11&lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.interface&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;from&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;zope.schema.fieldproperty&lt;/span&gt; &lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; FieldProperty&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;interfaces&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); font-weight: bold;"&gt;Contact&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;object&lt;/span&gt;):&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt;"""See ``zcontact.interfaces.IContact``."""&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;zope&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;interface&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;implements(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact)&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;firstName &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; FieldProperty(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact[&lt;span style="color: rgb(186, 33, 33);"&gt;'firstName'&lt;/span&gt;])&lt;br /&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="color: rgb(186, 33, 33); font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;lastName &lt;span style="color: rgb(102, 102, 102);"&gt;=&lt;/span&gt; FieldProperty(interfaces&lt;span style="color: rgb(102, 102, 102);"&gt;.&lt;/span&gt;IContact[&lt;span style="color: rgb(186, 33, 33);"&gt;'lastName'&lt;/span&gt;])&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-weight: bold;"&gt;2.5.3 Регистрация безопасности для класса Contact&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Еще нам нужно зарегистрировать класс&lt;a class="toc-backref" href="http://docs.carduner.net/z3c-tutorial/#id13" id="security-registration-for-the-contact-class" name="security-registration-for-the-contact-class"&gt;&lt;/a&gt; &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Contact&lt;/span&gt;&lt;/tt&gt; в zcml и настроить права для доступа к атрибутам. Просто добивим следующее в файл &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;src/zcontact/configure.zcml&lt;/span&gt;&lt;/tt&gt;&lt;/div&gt;&lt;div class="section"&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SAX4BBAOsfI/AAAAAAAAAAU/iVLKGKiPUnM/s1600-h/lj1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_Tt0FLQYa9Jg/SAX4BBAOsfI/AAAAAAAAAAU/iVLKGKiPUnM/s320/lj1.jpg" alt="" id="BLOGGER_PHOTO_ID_5189826841947320818" border="0" /&gt;&lt;/a&gt;Когда все это проделано, мы можем окунуться в виды, которые используют компоненты z3c.*! &lt;/div&gt;&lt;div class="caution"&gt; &lt;p class="first admonition-title"&gt;Внимание!&lt;/p&gt; &lt;p class="last"&gt;Не забудьте, в реальном мире вам сначала следовало бы написать unit-тесты для этого кода, чтобы убедиться в том, что класс &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Contact&lt;/span&gt;&lt;/tt&gt; действительно реализует интерфейс &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;IContact&lt;/span&gt;&lt;/tt&gt;!&lt;a class="toc-backref" href="http://docs.carduner.net/z3c-tutorial/#id14" id="forms-with-z3c-form" name="forms-with-z3c-form"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-6680635092254169770?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/6680635092254169770/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=6680635092254169770' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/6680635092254169770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/6680635092254169770'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/04/z3c-tutorial-2.html' title='z3c-tutorial. 2 глава!'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Tt0FLQYa9Jg/SAX3lhAOseI/AAAAAAAAAAM/jnqf__50Oeo/s72-c/lj0.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-5198583994221265424</id><published>2008-04-15T17:35:00.000+04:00</published><updated>2008-04-15T18:02:28.824+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='z3c'/><category scheme='http://www.blogger.com/atom/ns#' term='z3c-tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='zope'/><title type='text'>Перевод z3c-tutorial</title><content type='html'>Оригинал доступен по адресу http://docs.carduner.net/z3c-tutorial/. Сразу скажу, что пишу этот перевод в первую очередь для себя. Дополнения, замечания приветствуются. Итак, поехали!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;1 Введение&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;За прошедшие девять или около того месяцев с того момента как Philipp von Weitershausen опубликовал второе издание книги "Разработка Веб-компонентов с помощью Zope 3 (&lt;em&gt;Web Component Development with Zope 3)&lt;/em&gt;", Zope 3 претерпела значительные изменения и реструктуризацию. Приложение, некогда известное как Zope 3, разбилось на сотни частей, которые все вместе составляют "среду разработки Zope 3" ("Zope 3 the framework"). Каждый Zope-компонент стал отдельным пакетом, разделяемым посредством капсул-яиц (eggs), со сложной древовидной структорой (ever-complex dependency trees). Еще одно важное изменение для Zope за прошедшие 9 месяцев было создание множества пакетов, поддерживаемых сообществом, которые не входят в ядро Zope. Это z3c.* пакеты. Написанные преимущественно преданными и упорными Zope 3-хакерами, старающимися сделать Zope еще мощнее, чем раньше, пакеты z3c.* быстро стали центром внимания. К несчастью, нам, простым смертным (Unfortunately for the rest of us :), те, кто знал, как использовать пакеты z3c.*, были слишком заняты своей работой, будучи невероятно продуктивными и успешными, никогда не писали никаких новых книг, руководств или изи-ту-фоллоу (легкой в освоении - прочитал и сделал) документации. Этот документ нацелен на облегчение жизни тем, кто все еще делает вещи по-старому, и предоставляет легкое и непринужденное введение в z3c.*.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.1 Для кого предназначено (и не предназначено) данное руководство&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Это руководство было изначально написано для тех, кто уже имел некоторый опыт работы с Zope 3. Предполагается, что читатель имеет определенный уровень понимания касательно основных парадигм Zope, а именно: компонентной архитектуры, конфигурации ZCML, tal страниц шаблонов (tal page templates) и, конечно же, питона. К счастью, существуют отличные книги, в которых раскрываются данные темы. Если вы еще не читали, я настоятельно рекомендую вам обратить внимание на книгу "Разработка Веб-компонентов с помощью Zope 3 (&lt;em&gt;Web Component Development with Zope 3)&lt;/em&gt;", автор Philipp von Weitershausen, и использовать ее в качестве дополнения к этому руководству. Baiju M также написал великолепную онлайн-книгу, описывающую все детали компонентной архитектуры. Эту книгу вы можете найти по адресу: &lt;a class="reference" href="http://www.muthukadan.net/docs/zca.html"&gt;http://www.muthukadan.net/docs/zca.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-5198583994221265424?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/5198583994221265424/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=5198583994221265424' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/5198583994221265424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/5198583994221265424'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/04/z3c-tutorial.html' title='Перевод z3c-tutorial'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-3773296033545397839</id><published>2008-03-26T12:16:00.000+03:00</published><updated>2008-03-26T12:17:52.398+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='тест'/><category scheme='http://www.blogger.com/atom/ns#' term='музыка'/><title type='text'>Делись своей музыкой с кем угодно и где угодно!</title><content type='html'>&lt;style type="text/css"&gt;table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 td {margin:0 !important;padding:0 !important;border:0 !important;}table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 tr.lfmHead a:hover {background:url(http://cdn.last.fm/widgets/images/ru/header/chart/recenttracks_regular_black.png) no-repeat 0 0 !important;}table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 tr.lfmEmbed object {float:left;}table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 tr.lfmFoot td.lfmConfig a:hover {background:url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat 0px 0 !important;;}table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 tr.lfmFoot td.lfmView a:hover {background:url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat -85px 0 !important;}table.lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3 tr.lfmFoot td.lfmPopup a:hover {background:url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat -159px 0 !important;}&lt;/style&gt;&lt;br /&gt;&lt;table class="lfmWidgetchart_e6a0b1f17af128068bbec8246b7d16d3" style="width: 184px;" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr class="lfmHead"&gt;&lt;td&gt;&lt;a title="vitaly80: Недавно прослушанные композиции" href="http://www.lastfm.ru/user/vitaly80/" target="_blank" style="border: 0pt none ; background: transparent url(http://cdn.last.fm/widgets/images/ru/header/chart/recenttracks_regular_black.png) no-repeat scroll 0pt -20px; overflow: hidden; display: block; height: 20px; width: 184px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmEmbed"&gt;&lt;td&gt;&lt;a style="left: 184px ! important; top: 0px ! important;" title="Нажмите здесь, чтобы Adblock Plus заблокировал этот объект" class="abp-objtab-029068064338831934 visible ontop" href="http://cdn.last.fm/widgets/chart/friends_6.swf"&gt;&lt;/a&gt;&lt;object type="application/x-shockwave-flash" data="http://cdn.last.fm/widgets/chart/friends_6.swf" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" height="199" width="184"&gt; &lt;param name="movie" value="http://cdn.last.fm/widgets/chart/friends_6.swf"&gt; &lt;param name="flashvars" value="type=recenttracks&amp;amp;user=vitaly80&amp;amp;theme=black&amp;amp;lang=ru&amp;amp;widget_id=chart_e6a0b1f17af128068bbec8246b7d16d3"&gt; &lt;param name="bgcolor" value="000000"&gt; &lt;param name="quality" value="high"&gt; &lt;param name="allowScriptAccess" value="always"&gt; &lt;param name="allowNetworking" value="all"&gt; &lt;/object&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr class="lfmFoot"&gt;&lt;td style="background: transparent url(http://cdn.last.fm/widgets/images/footer_bg/black.png) repeat-x scroll 0pt 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: right;"&gt;&lt;table style="width: 184px;" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lfmConfig"&gt;&lt;a href="http://www.lastfm.ru/widgets/?colour=black&amp;amp;chartType=recenttracks&amp;amp;user=vitaly80&amp;amp;chartFriends=1&amp;amp;from=code&amp;amp;widget=chart" title="Создай свой виджет" target="_blank" style="border: 0pt none ; background: transparent url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat scroll 0px -20px; overflow: hidden; display: block; width: 85px; height: 20px; float: right; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="lfmView" style="width: 74px;"&gt;&lt;a href="http://www.lastfm.ru/user/vitaly80/" title="Открыть профиль vitaly80" target="_blank" style="border: 0pt none ; background: transparent url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat scroll -85px -20px; overflow: hidden; display: block; width: 74px; height: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-decoration: none;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="lfmPopup" style="width: 25px;"&gt;&lt;a href="http://www.lastfm.ru/widgets/popup/?colour=black&amp;amp;chartType=recenttracks&amp;amp;user=vitaly80&amp;amp;chartFriends=1&amp;amp;from=code&amp;amp;widget=chart&amp;amp;resize=1" title="Открыть во всплывающем окне" target="_blank" style="border: 0pt none ; background: transparent url(http://cdn.last.fm/widgets/images/ru/footer/black.png) no-repeat scroll -159px -20px; overflow: hidden; display: block; width: 25px; height: 20px; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-decoration: none;" onclick="window.open(this.href + '&amp;resize=0','lfm_popup','height=299,width=234,resizable=yes,scrollbars=yes'); return false;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-3773296033545397839?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/3773296033545397839/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=3773296033545397839' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/3773296033545397839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/3773296033545397839'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/03/blog-post.html' title='Делись своей музыкой с кем угодно и где угодно!'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6701318137774273286.post-5852410930526356476</id><published>2008-02-20T00:55:00.000+03:00</published><updated>2008-02-20T01:03:23.574+03:00</updated><title type='text'>Платон мне друг, но истина дороже</title><content type='html'>Пускай это будет первый пост. Хочется написать чего-нибудь интересного. Ради этого блога пришлось восстанавливать свой давно утраченный логин на гугле (вернее, он был на оркуте, когда деревья были большими). Кстати, до сих пор на оркуте забавляет иконка :))) Ну что, поехали?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6701318137774273286-5852410930526356476?l=vitaly80.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vitaly80.blogspot.com/feeds/5852410930526356476/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6701318137774273286&amp;postID=5852410930526356476' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/5852410930526356476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6701318137774273286/posts/default/5852410930526356476'/><link rel='alternate' type='text/html' href='http://vitaly80.blogspot.com/2008/02/blog-post.html' title='Платон мне друг, но истина дороже'/><author><name>vitaly80</name><uri>http://www.blogger.com/profile/16664138887935442074</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
