diff --git a/horilla_views/generic/cbv/views.py b/horilla_views/generic/cbv/views.py index b6474b718..c49d67207 100644 --- a/horilla_views/generic/cbv/views.py +++ b/horilla_views/generic/cbv/views.py @@ -791,6 +791,7 @@ class HorillaFormView(FormView): model: object = None view_id: str = get_short_uuid(4) + hx_confirm: str = "" form_class: forms.ModelForm = None template_name = "generic/horilla_form.html" ids_key: str = "instance_ids" @@ -847,6 +848,7 @@ class HorillaFormView(FormView): context["dynamic_create_fields"] = self.dynamic_create_fields context["form_class_path"] = self.form_class_path context["view_id"] = self.view_id + context["hx_confirm"] = self.hx_confirm pk = None if self.form.instance: pk = self.form.instance.pk @@ -901,11 +903,24 @@ class HorillaFormView(FormView): view.display_title = "Dynamic create" field = dynamic_tuple[0] key = self.request.session.session_key + "cbv" + field + field_instance = form.instance._meta.get_field(field) + value = [] + form_field = forms.ChoiceField + if isinstance(field_instance, models.models.ManyToManyField): + form_field = forms.MultipleChoiceField + if form.instance.pk is not None: + value = list( + getattr(form.instance, field).values_list( + "id", flat=True + ) + ) + else: + value = getattribute(getattribute(form.instance, field), "pk") CACHE.set( key, { "dynamic_field": field, - "value": getattribute(form.instance, field), + "value": value, "model": form._meta.model, }, ) @@ -925,12 +940,14 @@ class HorillaFormView(FormView): choices = [(instance.id, instance) for instance in queryset] choices.insert(0, ("", "Select option")) choices.append(("dynamic_create", "Dynamic create")) - form.fields[field] = forms.ChoiceField( + attrs = form.fields[field].widget.attrs + form.fields[field] = form_field( choices=choices, label=form.fields[field].label, required=form.fields[field].required, - widget=forms.Select(attrs=form.fields[field].widget.attrs), ) + form.fields[field].widget.attrs = attrs + form.initial[field] = value if pk: form.instance = instance title = str(instance) diff --git a/horilla_views/templates/generic/components.html b/horilla_views/templates/generic/components.html index 61f21c9cf..fcc5b1a72 100644 --- a/horilla_views/templates/generic/components.html +++ b/horilla_views/templates/generic/components.html @@ -8,6 +8,11 @@
+
+
+
+
+ + {% endfor %} -{% endfor %} -
{{form.structured}}
-{% for field_tuple in dynamic_create_fields %} - - - -{% endfor %} diff --git a/horilla_views/templates/generic/reload_select_field.html b/horilla_views/templates/generic/reload_select_field.html index e7170b829..8beab5d69 100644 --- a/horilla_views/templates/generic/reload_select_field.html +++ b/horilla_views/templates/generic/reload_select_field.html @@ -4,9 +4,17 @@ diff --git a/horilla_views/views.py b/horilla_views/views.py index e0b2c6350..4077ac1ec 100644 --- a/horilla_views/views.py +++ b/horilla_views/views.py @@ -79,13 +79,20 @@ class ReloadField(View): choices.insert(0, ("", "Select option")) choices.append(("dynamic_create", "Dynamic create")) - parent_form.fields[cache_field] = forms.ChoiceField( + form_field = forms.ChoiceField + if isinstance(field, forms.ModelMultipleChoiceField): + form_field = forms.MultipleChoiceField + + parent_form.fields[cache_field] = form_field( choices=choices, label=field.label, required=field.required, - widget=forms.Select(attrs=field.widget.attrs), ) - parent_form.fields[cache_field].initial = dynamic_cache["value"] + dynamic_initial = request.GET.get("dynamic_initial", []) + parent_form.fields[cache_field].widget.attrs = field.widget.attrs + parent_form.fields[cache_field].initial = eval( + f"""[{dynamic_cache["value"]},{dynamic_initial}]""" + ) field = parent_form[cache_field] dynamic_id: str = get_short_uuid(4)