I'm working on with Django, question and how to, is there any way to generate dynamic form based on the dropdown selection? My form is really simple, user will need to update device information. Instead of submitting one form at a time, I would like to provide options with dropdown select number of devices, let say 10, there should be 10 new forms entries.
Within 1 Form there are 4 fields needs to enter. I started something but stuck on view and display via html
MODEL
class Devices(DeviceINFO, models.Model):
name = models.ForeignKey(DeviceTYPE, on_delete=models.SET_NULL, null=True)
item1_link1 = models.CharField(max_length=5, blank=True, default='')
item1_link2 = models.CharField(max_length=5, blank=True, default='')
...
FORM:
class Devices_form(forms.ModelForm):
class Meta:
model = Devices
fields = '__all__'
def __init__(self, n, *args, **kwargs):
super(Devices_form, self).__init__(*args, **kwargs)
for i in range(0, n):
self.fields["item%d_link1" % i] = forms.CharField(max_length=20, blank=True, default='')
self.fields["item%d_link2" % i] = forms.CharField(max_length=20, blank=True, default='')
...
VIEW:
def DevicesView(request, *args, **kwargs):
template_name = 'DeviceView.html'
seq = [2, 4, 6, 8, 10]
form = Devices_form(request.POST or None)
if request.method == 'POST':
if form.is_valid():
print(form.cleaned_data['seq'])
context = { 'num': form.cleaned_data['seq'] }
return render(request, template_name, {'seq': seq})
Is that right way? How to display in html? Thanks for the help in advance.
You could create a list of empty forms based on the number requested and then render them in the template by iterating through the list.
def DevicesView(request, *args, **kwargs):
template_name = 'DeviceView.html'
seq = [2, 4, 6, 8, 10]
form = Devices_form(request.POST or None)
if request.method == 'POST':
if form.is_valid():
print(form.cleaned_data['seq'])
no_of_forms = form.cleaned_data['seq']
list_of_forms = [device_form() for i in range(no_of_forms)]
args = {'forms':list_of_forms}
return render(request, template_name, args)
return render(request, template_name, {'seq': seq})
Then in the HTML, something like:
{% for form in forms %}
{{ form.as_p }}
{% endfor %}