Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2010 17:33:39

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

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)

Офлайн

#2 Ноя. 11, 2010 23:29:22

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

В общем так:

Я так подозреваю, что в 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
И в шаблоне отрендерить все виджеты.



Офлайн

#3 Ноя. 12, 2010 19:29:18

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

скин (точнее слой) наследуется от IBrowserSkinType

class IUENTLayer(IBrowserSkinType):
"""Ural Expo NT layer"""
похоже, в IBrowserSkinType не включает в себя стандартные необходимости…

Может, пронаследователься от чего-то другого?



Офлайн

#4 Ноя. 13, 2010 10:34:30

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

Роттердам подключил в 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. В вашем класе добавить кастомный шаблон
Сделал, работает.
Но виджеты выставлять вручную.. А можно как-то автоматом?



Отредактировано (Ноя. 13, 2010 11:05:01)

Офлайн

#5 Ноя. 13, 2010 11:51:55

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

виджеты отрендерил вот таким методом:

    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)



Офлайн

#6 Ноя. 13, 2010 12:16:34

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

Посмотрел рабочий вариант:

<input type="submit" id="form.actions.add" name="form.actions.add" value="Add" class="button" />
работает.

Но вопрос о том, как сформировать форму автоматически в своём шаблоне остаётся открытым. Уверен, что способ есть.



Офлайн

#7 Ноя. 14, 2010 17:26:54

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB LocationError: 'standard_macros'

В любом случае где-то есть код, который рендерит виджеты. Он может быть в шаблоне из Роттердама, или в вашем коде.
Вот минимальный (как по мне) код для рендеринга формы:

<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>
А дальше оборачивайте его как захотите.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version