0

I have a form with 4 fields.

class data_collect_form(forms.Form):
    data_entry1 = forms.IntegerField(widget = forms.NumberInput(attrs={"class":"form-control","initial":0}))
    data_entry2 = forms.IntegerField(widget = forms.NumberInput(attrs={"class":"form-control","initial":0})
    data_entry3 = forms.IntegerField(widget = forms.NumberInput(attrs={"class":"form-control","initial":0})
    data_entry4 = forms.IntegerField(widget = forms.NumberInput(attrs={"class":"form-control","initial":0}))

Based on the argument "number_of_fields" in the view, I would like to delete last fields of this form.

Here is the view:

def add_submission(request, number_of_fields ):
    #delete number of fields of data_collect_form according to number_of_fields argument
    if request.method == 'POST':
        form2 = data_collect_form(request.POST)
    else:
        form2 = data_collect_form()
    return render(request, 'main/second.html',{"form2":form2})

I am sure it should be possible with the __init__ method, but I do not have understanding on writing it correctly.

user3342072
  • 137
  • 6
  • 1
    Have a look at [`SplitArrayField`](https://docs.djangoproject.com/en/4.0/ref/contrib/postgres/forms/) so that you need to just change the size in `__init__` – STerliakov Jul 09 '22 at 13:41
  • @SUTerliakov this would be a solution, but I am using SQLite and it seems like it's not supported there. – user3342072 Jul 09 '22 at 13:48
  • Heh, actually it is. You need only form field, it doesn't need to have database counterpart. Then you have a list of selected items to process in view or `clean` method same way as you'd use `data_entry{1..4}`. You are not saving it to db anyway, so backend support is not important here. – STerliakov Jul 09 '22 at 14:00
  • I made you a very simple\raw example using the __delete__ methods. Should not be hard to apply to your specific use case https://goonlinetools.com/snapshot/code/#w1z6dupv3ccyi2jpeoqze – Carlo Jul 09 '22 at 14:03
  • @SUTerliakov oh wow, thank you for introducing me to it, I got it to work. Can you tell me how to access size parameter in the view? Naively I tried form2 = data_collect_form2()["data_entry"].size(16) but it didn't work. Thank you. – user3342072 Jul 09 '22 at 15:03
  • 1
    Probably `form = data_collect_form2(); form.fields["data_entry"].size = 16` – STerliakov Jul 09 '22 at 15:10

1 Answers1

1

should be pretty straight forward like this:

number_of_fields = 3
form2 = data_collect_form(number_of_fields)

init for class data_collect_form

def __init__(self, number_of_fields, *args, **kwargs):
    super(data_collect_form, self).__init__(*args, **kwargs)

    if number_of_fields < 4:
       self.fields.pop('data_entry4')

Django Forms: pass parameter to form

Removing a fields from a dynamic ModelForm

David Wenzel
  • 251
  • 1
  • 7
  • It displays 3 field entries in frontend, which is good. After submitting though, it throws '<' not supported between instances of 'QueryDict' and 'int' Error. I assume it comes from form2 = data_collect_form(request.POST). To circumvent it I passed form2 = data_collect_form(request.POST,number_of_fields=1), but got "data_collect_form.__init__() got multiple values for argument 'number_of_fields'". Am I doing something wrong? – user3342072 Jul 09 '22 at 15:56
  • 1
    try form2 = data_collect_form(number_of_fields, request.POST) – David Wenzel Jul 09 '22 at 16:39