KEMBAR78
Auto-extract defaults from namedtuple, dataclass, pydantic · Issue #1258 · django-components/django-components · GitHub
Skip to content

Auto-extract defaults from namedtuple, dataclass, pydantic #1258

@JuroOravec

Description

@JuroOravec

Just a small quality of life improvement.

As I'm using more features from v0.140 in my project, I notice that there's some code duplication when defining kwargs and their defaults:

@register("Autocomplete")
class Autocomplete(Component):
    template_file = "autocomplete.html"
    js_file = "autocomplete.js"

    class Kwargs(BaseModel):
        name: str | None = None
        editable: bool | None = None
        multiple: bool | None = None
        selected_items: list[AutocompleteItem] | None = None
        max_width: int | str | None = None
        placeholder: str | None = None
        attrs: dict | None = None
        js: dict | None = None

    class Defaults:
        name = "value"
        max_width = "300px"
        placeholder = "Search..."
        js = Default(lambda: {})
        editable = True

From implementation's perspective this makes sense - we (DJC) cannot assume what class will Kwargs class. Maybe it will contain defaults, may it won't.

But in real world usage, I assume that Kwargs will be mostly like one of 3 kinds:

  • NamedTuple
  • Dataclass
  • Pydantic model

So I think we could add support for these, such that the above could be condensed into

@register("Autocomplete")
class Autocomplete(Component):
    template_file = "autocomplete.html"
    js_file = "autocomplete.js"

    class Kwargs(BaseModel):
        name: str | None = "value"
        editable: bool | None = True
        multiple: bool | None = None
        selected_items: list[AutocompleteItem] | None = None
        max_width: int | str | None = "300px"
        placeholder: str | None = "Search..."
        attrs: dict | None = None
        js: dict | None = Field(default_factory=lambda: {})

Since Pydantic is a 3rd party, I'm thinking:

  • NamedTuple and dataclass support should be implemented in core DJC
  • Pydantic model support should live in djc-ext-pydantic

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions