from typing import Any, Dict, List, NamedTuple, Optional, Set, Tuple from django_components import Component, Slot, register, types @register("form") class Form(Component): class Kwargs(NamedTuple): editable: bool = True method: str = "post" form_content_attrs: Optional[dict] = None attrs: Optional[dict] = None def get_template_data(self, args, kwargs: Kwargs, slots: Dict[str, Slot], context): fields = prepare_form_grid(slots) return { "form_content_attrs": kwargs.form_content_attrs, "method": kwargs.method, "editable": kwargs.editable, "attrs": kwargs.attrs, "fields": fields, } template: types.django_html = """
{% slot "prepend" / %}
{# Generate a grid of fields and labels out of given slots #}
{% for field_name, label in fields %} {{ label }} {% slot name=field_name / %} {% endfor %}
{% slot "append" / %}
""" # Users of this component can define form fields as slots. # # For example: # ```django # {% component "form" %} # {% fill "field:field_1" / %} #