Render API
When a component is being rendered, whether with Component.render()
or {% component %}
, a component instance is populated with the current inputs and context. This allows you to access things like component inputs - methods and attributes on the component instance which would otherwise not be available.
We refer to these render-only methods and attributes as the "Render API".
Render API is available inside these Component
methods:
Example:
class Table(Component):
def get_context_data(self, *args, **attrs):
# Access component's ID
assert self.id == "djc1A2b3c"
# Access component's inputs, slots and context
assert self.input.args == (123, "str")
assert self.input.kwargs == {"variable": "test", "another": 1}
footer_slot = self.input.slots["footer"]
some_var = self.input.context["some_var"]
# Access the request object and Django's context processors, if available
assert self.request.GET == {"query": "something"}
assert self.context_processors_data['user'].username == "admin"
return {
"variable": variable,
}
rendered = Table.render(
kwargs={"variable": "test", "another": 1},
args=(123, "str"),
slots={"footer": "MY_SLOT"},
)
Accessing Render API¤
If you try to access the Render API outside of a render call, you will get a RuntimeError
.
Component ID¤
Component ID (or render ID) is a unique identifier for the current render call.
That means that if you call Component.render()
multiple times, the ID will be different for each call.
It is available as self.id
.
Component inputs¤
All the component inputs are captured and available as self.input
.
self.input
(ComponentInput
) has the mostly the same fields as the input to Component.render()
. This includes:
args
- List of positional argumentskwargs
- Dictionary of keyword argumentsslots
- Dictionary of slots. Values are normalized toSlot
instancescontext
-Context
object that should be used to render the component- And other kwargs passed to
Component.render()
liketype
andrender_dependencies
Thus, use can use self.input.args
and self.input.kwargs
to access the positional and keyword arguments passed to Component.render()
.
def get_context_data(self, *args, **kwargs):
# Access component's inputs, slots and context
assert self.input.args == [123, "str"]
assert self.input.kwargs == {"variable": "test", "another": 1}
footer_slot = self.input.slots["footer"]
some_var = self.input.context["some_var"]
return {}
rendered = TestComponent.render(
kwargs={"variable": "test", "another": 1},
args=(123, "str"),
slots={"footer": "MY_SLOT"},
)
Request object and context processors¤
If the component was either:
- Given a
request
kwarg - Rendered with
RenderContext
- Nested in another component for which any of these conditions is true
Then the request object will be available in self.request
.
If the request object is available, you will also be able to access the context processors
data in self.context_processors_data
.
This is a dictionary with the context processors data.
If the request object is not available, then self.context_processors_data
will be an empty dictionary.
from django.http import HttpRequest
class Table(Component):
def get_context_data(self, *args, **attrs):
# Access the request object and Django's context processors
assert self.request.GET == {"query": "something"}
assert self.context_processors_data['user'].username == "admin"
return {}
rendered = Table.render(
request=HttpRequest(),
)
Warning
The self.context_processors_data
object is generated dynamically, so changes to it are not persisted.