首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建具有动态字段数量的Django表单类

创建具有动态字段数量的Django表单类
EN

Stack Overflow用户
提问于 2011-03-30 04:20:01
回答 5查看 68.3K关注 0票数 55

我正在做一个网上商店之类的东西。我正在制作一个表单,客户可以在其中购买一个项目,并且她可以选择她想要购买的这些项目的数量。但是,在她购买的每一件商品上,她都需要选择它的颜色。因此,字段的数量是非常多的:如果顾客购买了3件商品,她应该得到3个用于选择颜色的<select>盒子,如果她购买了7件商品,她应该得到7个这样的<select>盒子。

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

有什么线索吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-30 04:38:43

雅各布·卡普兰-莫斯对动态表单字段做了大量的介绍:http://jacobian.org/writing/dynamic-form-generation/

本质上,您在实例化期间向表单的self.fields字典添加了更多项。

票数 74
EN

Stack Overflow用户

发布于 2011-03-30 06:02:36

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

django admin使用FormSets +一点javascript来添加任意长度的内联。

代码语言: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

代码语言: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>

模板

代码语言:javascript
复制
    <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" />
票数 36
EN

Stack Overflow用户

发布于 2011-03-30 04:46:19

你可以像这样做

代码语言:javascript
复制
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()

创建表单实例时,您只需执行以下操作

代码语言:javascript
复制
forms = your_form(n)

这只是基本的想法,你可以随心所欲地修改代码。:D

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5478432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档