zope.contentprovider
raw JSON → 7.0 verified Mon Apr 27 auth: no python
Content Provider Framework for Zope Templates. Provides a mechanism for registering and rendering pluggable content providers (widgets, portlets) in Zope Page Templates. Current version: 7.0, released 2024-07-18. Release cadence: ad-hoc, based on Zope Toolkit releases.
pip install zope.contentprovider Common errors
error ImportError: cannot import name 'IContentProvider' from 'zope.contentprovider' ↓
cause Incorrect import path; IContentProvider is in the 'interfaces' submodule.
fix
Use: from zope.contentprovider.interfaces import IContentProvider
error TypeError: Can't instantiate abstract class MyProvider with abstract methods render ↓
cause Missing implementation of render() method.
fix
Add a render() method that returns a string.
error zope.configuration.config.ConfigurationConflictError: Conflicting configuration for 'contentProvider' ↓
cause Duplicate registration of the same provider via ZCML.
fix
Remove duplicate ZCML directives or register only once.
Warnings
breaking In version 7.0, removed support for Python 2 and Python < 3.9. Also dropped 'zope.contentprovider.browser' module (merged functionality into 'provider'). ↓
fix Upgrade to Python >=3.9 and adjust imports: replace 'zope.contentprovider.browser' with 'zope.contentprovider.provider'.
deprecated Global content provider registration via ZCML directive (<browser:contentProvider />) is deprecated in favor of Python-based registration using zope.component. ↓
fix Use zope.component's provideAdapter or provideUtility to register providers programmatically.
gotcha ContentProviderBase.render() must return a unicode string (or bytes in Python 3). Returning None or non-string objects will cause template rendering errors. ↓
fix Ensure render() always returns a string: return '' or str() if no content.
gotcha When using TALESContentProvider expression in Page Templates, the expression engine expects the provider to be registered as a utility. Unregistered providers silently return empty string. ↓
fix Register your provider with zope.component.provideUtility(provider, IContentProvider) before template rendering.
Imports
- IContentProvider wrong
from zope.contentprovider import IContentProvidercorrectfrom zope.contentprovider.interfaces import IContentProvider - ContentProviderBase wrong
from zope.contentprovider import ContentProviderBasecorrectfrom zope.contentprovider.provider import ContentProviderBase - TALESContentProvider wrong
from zope.contentprovider.tales import TALESContentProviderExprcorrectfrom zope.contentprovider.tales import TALESContentProvider
Quickstart
from zope.interface import implementer
from zope.contentprovider.interfaces import IContentProvider
from zope.contentprovider.provider import ContentProviderBase
@implementer(IContentProvider)
class MyProvider(ContentProviderBase):
def __init__(self, context, request, view):
super().__init__(context, request, view)
def render(self):
return '<p>Hello from MyProvider</p>'