Найти - Пользователи
Полная версия: BB LocationError: 'standard_macros'
Начало » Zope/Plone/Bluebream » BB LocationError: 'standard_macros'
1
LightOfMooN
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
Sleepwalker
В общем так:

Я так подозреваю, что в 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
И в шаблоне отрендерить все виджеты.
LightOfMooN
скин (точнее слой) наследуется от IBrowserSkinType
class IUENTLayer(IBrowserSkinType):
"""Ural Expo NT layer"""
похоже, в IBrowserSkinType не включает в себя стандартные необходимости…

Может, пронаследователься от чего-то другого?
LightOfMooN
Роттердам подключил в site.zcml, эффект тот же
<include package="zope.app.rotterdam" />
Попробовал пронаследовать скин от Роттердама
from zope.app.rotterdam import Rotterdam

class IUENTLayer(Rotterdam):
"""Ural Expo NT layer"""
Получил вот такой трейс: http://paste.org/pastebin/view/24800
Sleepwalker
2. В вашем класе добавить кастомный шаблон
Сделал, работает.
Но виджеты выставлять вручную.. А можно как-то автоматом?
LightOfMooN
виджеты отрендерил вот таким методом:
    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])
Как обработать данные, не испортив стандартные возможности form?
(всмысле, как вызвать метод createAndAdd)
LightOfMooN
Посмотрел рабочий вариант:
<input type="submit" id="form.actions.add" name="form.actions.add" value="Add" class="button" />
работает.

Но вопрос о том, как сформировать форму автоматически в своём шаблоне остаётся открытым. Уверен, что способ есть.
Sleepwalker
В любом случае где-то есть код, который рендерит виджеты. Он может быть в шаблоне из Роттердама, или в вашем коде.
Вот минимальный (как по мне) код для рендеринга формы:
<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>
А дальше оборачивайте его как захотите.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB