diff --git a/crudkit/ui/fragments.py b/crudkit/ui/fragments.py
index 0fda60a..47d5487 100644
--- a/crudkit/ui/fragments.py
+++ b/crudkit/ui/fragments.py
@@ -661,6 +661,30 @@ def _class_for(val: Any, classes: Optional[Dict[str, str]]) -> Optional[str]:
key = "none" if val is None else str(val).lower()
return classes.get(key, classes.get("default"))
+def _format_label_from_values(spec: Any, values: dict) -> Optional[str]:
+ if not spec:
+ return None
+ if isinstance(spec, (list, tuple)):
+ parts = []
+ for a in spec:
+ v = _deep_get(values, str(a))
+ parts.append("" if v is None else str(v))
+ return " ".join(p for p in parts if p)
+
+ s = str(spec)
+ if "{" in s and "}" in s:
+ names = re.findall(r"{\s*([^}:\s]+)", s)
+ data = {n: _deep_get(values, n) for n in names}
+ # wrap for safe .format()
+ data = {k: ("" if v is None else v) for k, v in data.items()}
+ try:
+ return s.format(**data)
+ except Exception:
+ return None
+ # simple field name
+ v = _deep_get(values, s)
+ return "" if v is None else str(v)
+
def _build_href(spec: Dict[str, Any], row: Dict[str, Any], obj) -> Optional[str]:
if not spec:
return None
@@ -915,6 +939,19 @@ def render_form(
if vl is not None:
f["value_label"] = vl
+ for f in fields:
+ # existing FK label resolution
+ vl = _value_label_for_field(f, mapper, values_map, instance, session)
+ if vl is not None:
+ f["value_label"] = vl
+ # NEW: if not a relationship but a label_spec is provided, format from values
+ elif f.get("label_spec"):
+ base, rel_prop = _rel_for_id_name(mapper, f["name"])
+ if not rel_prop: # scalar field
+ vl2 = _format_label_from_values(f["label_spec"], values_map)
+ if vl2 is not None:
+ f["value_label"] = vl2
+
# Build rows (supports nested layout with parents)
rows_map = _normalize_rows_layout(layout)
rows_tree = _assign_fields_to_rows(fields, rows_map)
diff --git a/crudkit/ui/templates/field.html b/crudkit/ui/templates/field.html
index 81b7062..0efe44b 100644
--- a/crudkit/ui/templates/field.html
+++ b/crudkit/ui/templates/field.html
@@ -47,6 +47,24 @@
{{k}}{% if v is not sameas true %}="{{ v }}"{% endif %}
{% endfor %}{% endif %}>{{ value_label if value_label else (value if value else "") }}
+{% elif field_type == "date" %}
+
+
+{% elif field_type == "time" %}
+
+
+{% elif field_type == "datetime" %}
+
+
{% else %}
+ UPDATES NOT IMPLEMENTED YET
+
\ No newline at end of file