Ram*_*hum 49 python forms django
我正在做类似在线商店的事情.我正在制作一个客户购买物品的表格,她可以选择她想要购买的这些物品中的多少.但是,在她购买的每件商品上,她都需要选择它的颜色.因此,有一个非常数量的字段:如果顾客购买3件物品,她应该有3 <select>盒选择颜色,如果她购买7件物品,她应该得到7个这样的<select>盒子.
我将使用JavaScript使HTML表单字段显示和消失.但是如何在我的Django表单类中处理这个问题呢?我看到表单字段是类属性,所以我不知道如何处理一些表单实例应该有3个颜色字段和7个字段的事实.
任何线索?
GDo*_*orn 69
雅各布·卡普兰·莫斯(Jacob Kaplan-Moss)对动态表格领域进行了广泛的撰写:http: //jacobian.org/writing/dynamic-form-generation/
实质上,您self.fields在实例化期间向表单的字典中添加了更多项.
Yuj*_*ita 34
这是另一种选择: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}))
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
<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" />
Run Code Online (Sandbox Code Playgroud)
owe*_*ter 20
你可以这样做
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()
Run Code Online (Sandbox Code Playgroud)
当你创建表单实例时,你就是这样做的
forms = your_form(n)
Run Code Online (Sandbox Code Playgroud)
这只是基本的想法,您可以将代码更改为您想要的任何内容.:d
小智 6
我会这样做的方式如下:
创建一个继承自 的“空”类froms.Form,如下所示:
class ItemsForm(forms.Form):
pass
Run Code Online (Sandbox Code Playgroud)构造一个作为实际表单的表单对象字典,其组成将取决于上下文(例如,您可以从外部模块导入它们)。例如:
new_fields = {
'milk' : forms.IntegerField(),
'butter': forms.IntegerField(),
'honey' : forms.IntegerField(),
'eggs' : forms.IntegerField()}
Run Code Online (Sandbox Code Playgroud)在视图中,您可以使用 python 原生的“type”函数来动态生成具有可变数量字段的 Form 类。
DynamicItemsForm = type('DynamicItemsForm', (ItemsForm,), new_fields)
Run Code Online (Sandbox Code Playgroud)将内容传递给表单并在模板中呈现:
Form = DynamicItemsForm(content)
context['my_form'] = Form
return render(request, "demo/dynamic.html", context)
Run Code Online (Sandbox Code Playgroud)“内容”是字段值的字典(例如,即使 request.POST 也可以)。您可以在此处查看我对整个示例的解释。
| 归档时间: |
|
| 查看次数: |
54366 次 |
| 最近记录: |