Validate components' inputs and outputs using Pydantic.
djc-ext-pydantic
is a django-component extension that integrates Pydantic for input and data validation.
from django_components import Component, SlotInput
from djc_pydantic import ArgsBaseModel
from pydantic import BaseModel
# 1. Define the Component with Pydantic models
class MyComponent(Component):
class Args(ArgsBaseModel):
var1: str
class Kwargs(BaseModel):
name: str
age: int
class Slots(BaseModel):
header: SlotInput
footer: SlotInput
class TemplateData(BaseModel):
data1: str
data2: int
class JsData(BaseModel):
js_data1: str
js_data2: int
class CssData(BaseModel):
css_data1: str
css_data2: int
...
# 2. Render the component
MyComponent.render(
# ERROR: Expects a string
args=(123,),
kwargs={
"name": "John",
# ERROR: Expects an integer
"age": "invalid",
},
slots={
"header": "...",
# ERROR: Expects key "footer"
"foo": "invalid",
},
)
pip install djc-ext-pydantic
Then add the extension to your project:
# settings.py
COMPONENTS = {
"extensions": [
"djc_pydantic.PydanticExtension",
],
}
or by reference:
# settings.py
from djc_pydantic import PydanticExtension
COMPONENTS = {
"extensions": [
PydanticExtension,
],
}
By default, Pydantic's BaseModel
requires all fields to be passed as keyword arguments. If you want to validate positional arguments, you can use a custom subclass ArgsBaseModel
:
from pydantic import BaseModel
from djc_pydantic import ArgsBaseModel
class MyTable(Component):
class Args(ArgsBaseModel):
a: int
b: str
c: float
MyTable.render(
args=[1, "hello", 3.14],
)
Read the Release Notes to see the latest features and fixes.
To run tests, use:
pytest