From 60b113f19751acfa007c5e3569cf50c7a9e42aa9 Mon Sep 17 00:00:00 2001 From: billybonks Date: Tue, 6 Feb 2024 14:08:24 +0800 Subject: [PATCH] feat: create fieldset implementation In order to have more control and flexiability on how elements are rendered create field set implementation. every field set gets rendered in order, and uses the template specified. This should probably be built into the metaclass of the form but i have no idea how to do that. --- babybuddy/templates/babybuddy/form.html | 16 +++++++--- .../babybuddy/form_field_no_label.html | 31 +++++++++++++++++++ core/forms.py | 25 +++++++++++++++ 3 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 babybuddy/templates/babybuddy/form_field_no_label.html 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: