diff --git a/babybuddy/templates/babybuddy/form.html b/babybuddy/templates/babybuddy/form.html index 099a408b..1cabb1fe 100644 --- a/babybuddy/templates/babybuddy/form.html +++ b/babybuddy/templates/babybuddy/form.html @@ -4,10 +4,18 @@
{% csrf_token %} - {% for field in form %} - {{ field.widget }} -
{% include 'babybuddy/form_field.html' %}
- {% endfor %} + {% if form.fieldsets %} + {% for fieldset in form.hydrated_fielsets %} + {% with "forms/layouts/"|add:fieldset.layout|add:".html" as template %} + {% include template %} + {% endwith %} + {% endfor %} + {% else %} + {% for field in form %} + {{ field.widget }} +
{% include 'babybuddy/form_field.html' %}
+ {% endfor %} + {% endif %}
diff --git a/babybuddy/templates/babybuddy/form_field_no_label.html b/babybuddy/templates/babybuddy/form_field_no_label.html new file mode 100644 index 00000000..eeef3f95 --- /dev/null +++ b/babybuddy/templates/babybuddy/form_field_no_label.html @@ -0,0 +1,31 @@ +{% load widget_tweaks %} +{% if field|field_type == "booleanfield" %} + {% if field.errors %} + {{ field|add_class:"btn-check is-invalid" }} + {% else %} + {{ field|add_class:"btn-check" }} + {% endif %} + +{% elif 'choice' in field|field_type %} + {% if field.errors %} + {{ field|add_class:"form-select is-invalid" }} + {% else %} + {{ field|add_class:"form-select" }} + {% endif %} +{% else %} + {% if field.errors %} + {{ field|add_class:"form-control is-invalid" }} + {% else %} + {{ field|add_class:"form-control" }} + {% endif %} +{% endif %} +{% if field.help_text %} +
+ {{ field.help_text }} +
+{% endif %} +{% if field.errors %} +
+ {% for error in field.errors %}{{ error }}{% endfor %} +
+{% endif %} diff --git a/core/forms.py b/core/forms.py index dedd98ae..a1f283c5 100644 --- a/core/forms.py +++ b/core/forms.py @@ -107,6 +107,31 @@ class CoreModelForm(forms.ModelForm): self.save_m2m() return instance + @property + def hydrated_fielsets(self): + # for some reason self.fields returns defintions and not bound fields + # so until i figure out a better way we can just create a dict here + # https://github.com/django/django/blob/main/django/forms/forms.py#L52 + + bound_field_dict = {} + for field in self: + bound_field_dict[field.name] = field + + hydrated_fieldsets = [] + + for fieldset in self.fieldsets: + hyrdrated_fieldset = { + "layout": fieldset["layout"], + "layout_attrs": fieldset.get("layout_attrs", {}), + "fields": [], + } + for field_name in fieldset["fields"]: + hyrdrated_fieldset["fields"].append(bound_field_dict[field_name]) + + hydrated_fieldsets.append(hyrdrated_fieldset) + + return hydrated_fieldsets + class ChildForm(forms.ModelForm): class Meta: