Django基于下拉选择的动态创建表单

时间:2019-09-06 07:49:52

标签: python django forms dynamic generate

我正在与Django一起工作,问题以及如何解决,是否有任何方法可以基于下拉选择生成动态表单? 我的表格非常简单,用户需要更新设备信息。 我不想一次提交一个表单,而是提供带有下拉选择设备数量的选项,例如10个,应该有10个新表单条目。

在1个表格内,需要输入4个字段。 我开始了一些工作,但停留在视图上并通过html显示

模型

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='')
... 

查看:

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})

那是正确的方法吗?如何以html显示?感谢您的提前帮助。

1 个答案:

答案 0 :(得分:1)

您可以根据请求的数量创建一个空表单列表,然后通过遍历该列表将其呈现在模板中。

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})

然后在HTML中,类似:

{% for form in forms %}
    {{ form.as_p }}
{% endfor %}