用dynamic数量的字段创build一个Django表单类

我正在做一些网上商店。 我正在制作一个客户购买物品的表格,她可以select她想要购买的物品的数量。 但是,在她购买的每件商品上,她都需要select颜色。 所以有一个非常数的字段:如果客户购买3件商品,她应该得到3个<select>框来select一种颜色,如果她买了7件商品,她应该得到7个这样的<select>框。

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

任何线索?

Jacob Kaplan-Moss对dynamic表单字段进行了大量的描述: http : //jacobian.org/writing/dynamic-form-generation/

实质上,在实例化过程中,您可以将更多的项目添加到表单的字段成员variables。

这里有另外一个select:一个formset怎么样? 既然你的领域都是一样的,那么这正是所使用的formset。

Django的pipe理员使用FormSet s +的一点点的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)
  我在范围内(0,n):
     self.fields [“field_name%d”%i] = forms.CharField()

当你创build表单实例时,你只需要做

 forms = your_form(n)

这只是基本的想法,你可以将代码更改为任何你想要的。 :d