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