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
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.
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.

Minimal content provider implementation. Extend ContentProviderBase and implement render().

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>'