Introduce ObjectAttribute for displaying read-only instance attributes on forms

This commit is contained in:
Jeremy Stretch
2024-03-13 10:15:34 -04:00
parent 33b9ebb201
commit 8f03a19b5f
12 changed files with 40 additions and 78 deletions

View File

@@ -3,8 +3,8 @@ import string
from functools import cached_property
__all__ = (
'FieldGroup',
'InlineFields',
'ObjectAttribute',
'TabbedFieldGroups',
)
@@ -41,3 +41,9 @@ class TabbedFieldGroups:
'fields': group.field_names,
} for i, group in enumerate(self.groups, start=1)
]
class ObjectAttribute:
def __init__(self, name):
self.name = name

View File

@@ -12,6 +12,17 @@
{# Single form field #}
{% render_field items.0 %}
{% elif layout == 'attribute' %}
{# A static attribute of the form's instance #}
<div class="row mb-3">
<label class="col-sm-3 col-form-label text-lg-end required">{{ title }}</label>
<div class="col">
<div class="form-control-plaintext">
{{ items.0|linkify }}
</div>
</div>
</div>
{% elif layout == 'inline' %}
{# Multiple form fields on the same line #}
<div class="row mb-3">

View File

@@ -1,6 +1,6 @@
from django import template
from utilities.forms.rendering import InlineFields, TabbedFieldGroups
from utilities.forms.rendering import InlineFields, ObjectAttribute, TabbedFieldGroups
__all__ = (
'getfield',
@@ -81,6 +81,13 @@ def render_fieldset(form, fieldset, heading=None):
('tabs', None, tabs)
)
elif type(item) is ObjectAttribute:
value = getattr(form.instance, item.name)
label = value._meta.verbose_name if hasattr(value, '_meta') else item.name
rows.append(
('attribute', label.title(), [value])
)
# A single form field
elif item in form.fields:
rows.append(