dabapps/django-forms-dynamic

Avoid validating dynamic field

mschoettle opened this issue · 2 comments

Thanks for this package and especially for the HTMX and Unpoly examples. It helped me realize that Unpoly might be a better fit (in my case) given the up-validate mechanism without needing a separate view.

When this is done, though, selecting a different make in the example causes the form to be validated. I.e., switching from "Audi" to "Toyota" causes the validation error "Select a valid choice. a1 is not one of the available choices.".

Is there any way to avoid that?

One way I thought about it, seeing the example in the official docs for [up-validate], is to handle it differently when the X-Up-Validate header is present:

if 'X-Up-Validate' in request.headers:
    form = MakeAndModelForm(initial=request.POST)

But there might be a better way to achieve this.

j4mie commented

Good catch, I've done something very similar in the past:

def is_validating(request):
    return "X-Up-Validate" in request.headers

Then in your form, something like this:

class MakeAndModelForm(DynamicFormMixin, forms.Form):
     ...
    model = DynamicField(
        forms.ChoiceField,
        choices=lambda form: form.MODEL_CHOICES[form["make"].value()],
        required=lambda form: not is_validating(form.context["request"]),
    )

Thanks! So there are different ways to achieve it depending on the use case. I wasn't sure if going the initial route is the appropriate way.