用动态字段数生成Django表单类

2024-05-16 21:00:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个类似网上商店的东西。我正在制作一个表格,让顾客购买一件商品,她可以选择要购买多少件。但是,在她买的每件商品上,她都需要选择它的颜色。所以有一个非固定的字段数:如果客户购买了3个项目,她应该得到3个用于选择颜色的<select>框,如果她购买了7个项目,她应该得到7个这样的<select>框。

我将使用JavaScript使HTML表单字段出现和消失。但是在我的Django form课上我该如何处理这个问题呢?我看到表单字段是类属性,所以我不知道如何处理这样一个事实:一些表单实例应该有3个颜色字段和7个颜色字段。

有线索吗?


Tags: 项目djangoform客户属性颜色htmljavascript
3条回答

雅各布·卡普兰·莫斯(Jacob Kaplan Moss)在动态表单领域有着广泛的著述: http://jacobian.org/writing/dynamic-form-generation/

实际上,在实例化期间,您可以向表单的self.fields字典中添加更多项。

这里还有另一个选择:一个formset怎么样? 因为您的字段都是相同的,所以这正是表单集的用途。

django管理员使用FormSets+一点javascript来添加任意长度的内联线。

class ColorForm(forms.Form):
    color = forms.ChoiceField(choices=(('blue', 'Blue'), ('red', 'Red')))

ColorFormSet = formset_factory(ColorForm, extra=0) 
# we'll dynamically create the elements, no need for any forms

def myview(request):
    if request.method == "POST":
        formset = ColorFormSet(request.POST)
        for form in formset.forms:
            print "You've picked {0}".format(form.cleaned_data['color'])
    else:
        formset = ColorFormSet()
    return render(request, 'template', {'formset': formset}))

JavaScript

    <script>
        $(function() {
            // this is on click event just to demo.
            // You would probably run this at page load or quantity change.
            $("#generate_forms").click(function() {
                // update total form count
                quantity = $("[name=quantity]").val();
                $("[name=form-TOTAL_FORMS]").val(quantity);  

                // copy the template and replace prefixes with the correct index
                for (i=0;i<quantity;i++) {
                    // Note: Must use global replace here
                    html = $("#form_template").clone().html().replace(/__prefix_/g', i);
                    $("#forms").append(html);
                };
            })
        })
    </script>

模板

    <form method="post">
        {{ formset.management_form }}
        <div style="display:none;" id="form_template">
            {{ formset.empty_form.as_p }}
        </div><!-- stores empty form for javascript -->
        <div id="forms"></div><!-- where the generated forms go -->
    </form>
    <input type="text" name="quantity" value="6" />
    <input type="submit" id="generate_forms" value="Generate Forms" />

你可以这样做

def __init__(self, n,  *args, **kwargs):
  super(your_form, self).__init__(*args, **kwargs)
  for i in range(0, n):
    self.fields["field_name %d" % i] = forms.CharField()

当你创建表单实例时

forms = your_form(n)

这只是一个基本的想法,你可以改变代码到任何你想要的。:天

相关问题 更多 >