我正在做一个网上商店之类的东西。我正在制作一个表单,客户可以在其中购买一个项目,并且她可以选择她想要购买的这些项目的数量。但是,在她购买的每一件商品上,她都需要选择它的颜色。因此,字段的数量是非常多的:如果顾客购买了3件商品,她应该得到3个用于选择颜色的<select>盒子,如果她购买了7件商品,她应该得到7个这样的<select>盒子。
我将使用JavaScript使HTML表单域出现和消失。但是我该如何在Django窗体类中处理这个问题呢?我看到表单字段是类属性,所以我不知道如何处理一些表单实例应该有3个颜色字段和7个颜色字段的事实。
有什么线索吗?
发布于 2011-03-30 04:38:43
雅各布·卡普兰-莫斯对动态表单字段做了大量的介绍:http://jacobian.org/writing/dynamic-form-generation/
本质上,您在实例化期间向表单的self.fields字典添加了更多项。
发布于 2011-03-30 06:02:36
这里有另一个选择:formset怎么样?因为您的字段都是相同的,所以这正是表单集的用途。
django admin使用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" />发布于 2011-03-30 04:46:19
你可以像这样做
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)这只是基本的想法,你可以随心所欲地修改代码。:D
https://stackoverflow.com/questions/5478432
复制相似问题