Форум сайта python.su
LocationError: (<uralexpont.content.publications.photo.photo.PhotoCollection object at 0x03614B30>, ‘standard_macros’)
Вот такая вот ошибка вылетает при попытке вызова обычного казалось бы вида @@add_photocatalog
вот порезанный донельзя код вьюшки:
class PhotoCatalogAdd(form.AddForm):
form_fields = form.Fields(IPhotoCatalog)
def createAndAdd(self):
photocatalog = PhotoCatalog()
photocatalog.name = u'photocatalog'
self.context = photocatalog
Есть идеи, откуда взялась ошибка?
Подозреваю, что это может быть связано со скином, сделанным по BB мануалу.
Полный трейс: http://paste.org/pastebin/view/24703
Отредактировано (Ноя. 11, 2010 17:39:27)
Офлайн
В общем так:
Я так подозреваю, что в zcml вьюхи вы не указали на прямую шаблон для формы, поэтому форма стандартно ищет макрос, который зарегестрироват в Rotterdam скине (который я так подозревая вы тоже не подключили). Поэтому, выхода есть 2:
1. Подключить Rotterdam: <include package=“zope.app.zcmlfiled” />
2. В вашем класе добавить кастомный шаблон:
class PhotoCatalogAdd(form.AddForm):
template = ViewPageTemplateFile("custom_template.pt")
form_fields = form.Fields(IPhotoCatalog)
def createAndAdd(self):
photocatalog = PhotoCatalog()
photocatalog.name = u'photocatalog'
self.context[photocatalog.name] = photocatalog
Офлайн
скин (точнее слой) наследуется от IBrowserSkinType
class IUENTLayer(IBrowserSkinType):
"""Ural Expo NT layer"""
Офлайн
Роттердам подключил в site.zcml, эффект тот же
<include package="zope.app.rotterdam" />
from zope.app.rotterdam import Rotterdam
class IUENTLayer(Rotterdam):
"""Ural Expo NT layer"""
SleepwalkerСделал, работает.
2. В вашем класе добавить кастомный шаблон
Отредактировано (Ноя. 13, 2010 11:05:01)
Офлайн
виджеты отрендерил вот таким методом:
def getForm(self, ignore_request=False):
widgets = form.setUpWidgets(
self.form_fields, 'form', self.context, self.request,
ignore_request=ignore_request)
return '\n'.join([w() for w in widgets])
Офлайн
Посмотрел рабочий вариант:
<input type="submit" id="form.actions.add" name="form.actions.add" value="Add" class="button" />
Офлайн
В любом случае где-то есть код, который рендерит виджеты. Он может быть в шаблоне из Роттердама, или в вашем коде.
Вот минимальный (как по мне) код для рендеринга формы:
<form method="post" tal:attributes="action request/URL" name="my_form">
<tal:loop repeat="widget view/widgets>
<label tal:attributes="for widget/name">
<tal:block content="widget/label" />
</label>
<tal:block content="structure widget" />
<tal:if condition="widget/error">
<tal:block content="strucuture widget/error" />
</tal:if>
</tal:loop>
<tal:loop repeat="action view/actions">
<tal:block content="structure action/render" />
</tal:loop>
</form>
Офлайн