I'm trying to use Publish Traverse for my AutoExtensible and for some reason, I can't get my form to set its fields. The form itself is acting as an 'edit' form.
I have ignoreContext set to True and getContent() to return the object from a query.
asset.py - Contains object class
from zope import schema
from plone.supermodel import model
from plone.autoform import directives
from plone.formwidget.autocomplete import AutocompleteFieldWidget
from my.product.myautovocabulary import MyAutoVocabulary
class IAsset(model.Schema):
"""fields stored in database"""
a = schema.TextLine(title=u"A",
required=True,)
directives.widget('b',AutocompleteFieldWidget)
b = schema.Choice(title=u"B",
required=MyAutoVocabulary(), )
class Asset(object):
a = None
b = None
def __init__(self,a=None,b=None):
self.a = a
self.b = b
assetforms.py: Contains edit form in addition to add form
from z3c.form import form, button
from zope.component import getUtility
from zope.interface import implementer
from zope.publisher.interfaces.browser import IPublishTraverse
from plone.autoform.form import AutoExtensibleForm
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from my.product.content.asset import IAsset
from my.product.utilities.interfaces import IAssetCatalog
@implementer(IPublishTraverse):
class EditAssetForm(AutoExtensibleForm, form.Form):
schema = IAsset
ignoreContext = True
label = u"Edit Asset"
description = u"Form for editing an asset"
form_name = editasset
__asset_id = None
def publishTraverse(self, request, name):
self.__asset_id = name
return self
def getContent(self):
catalog = getUtility(IAssetCatalog, 'assetCatalog')
asset = catalog.queryForType(Asset,Asset_ID = self.__asset_id)[0]
return asset
def updateWidgets(self, EditAssetForm):
super(EditAssetForm, self).updateWidgets()
@buttonAndHandler(u'Submit')
def handleApply(self, action):
data, errors = self.extractData()
if errors:
return False
catalog = getUtility(IAssetCatalog, 'assetCatalog')
catalog.updateAsset(self.__asset_id, a=data.get('a'), b=data.get('b'))
redirect_url = self.context.absolute_url() + "/viewasset/"+self.__asset_id
self.request.response.redirect(redirect_url)
I have an adapter class for IAsset.
formadapters.py
from zope import interface
from zope import component
from my.product.content.asset import IAsset
class AssetFormAdapter(object):
interface.implements(IAsset)
component.adapts(interface.Interface)
In my configure.zcml, I have:
<adapter factory=".formadapters.AssetFormAdapter"/>
<browser:page
for="my.product.content.assettracker.IAssetTracker"
name="addasset"
class="my.product.views.assetforms.AddAssetForm"
permission="zope2.View"
/>
<browser:page
for="my.product.content.assettracker.IAssetTracker"
name="editasset"
class="my.product.views.assetforms.EditAssetForm"
permission="zope2.View"
/>
The add form is working as it should, so I know my interface adapts to the database correctly.
However, the edit form won't fill in the fields automatically after getContent() is called.
I know getContent() and publishTraverse() are called though because I tried placing print statements in publish traverse (where __asset_id is being set) and getContent() (before return asset).
What am I doing wrong?
Edit: I fixed typos in my question. Also I tried
class EditForm(AutoExtensibleForm,form.EditForm) and I got the same results where the fields just won't fill in.