Django动态表单字段生成

时间:2015-11-10 23:57:01

标签: python django django-forms

我想创建一个包含' rooms'字段,它是整数字段。根据房间数量,我想为每个房间生成另外两个字段' extra_adult'和' extra_children'。并且取决于我想要生成的孩子的数量' children_age'字段。

我是Python和Django的新手,我尝试在DYNAMIC FORM GENERATION帖子上做类似here,但我坚持了几个问题:

1)我在forms.py中遇到错误global name 'rooms' is not defined

2)我应该如何cleaned_data extra_adultextra_childrenextra_children_age字段;

3)取决于孩子的数量如何添加extra_children_age字段。

这是我的form.py

class RoomsForm(forms.Form):
        rooms = forms.IntegerField(label=(min_value=1 )

        def __init__(self, *args, **kwargs):
                extra_adult = kwargs.pop('extra_adult', 0)
                extra_children = kwargs.pop('extra_children', 0)
                super(HotelForm, self).__init__(*args, **kwargs)
                for room in rooms:
                        self.fields['adult_%s' % room] = forms.IntegerField(min_value=1 )
                        self.fields['children_%s' % room] = forms.IntegerField(label=(required=False )

views.py

def bookingForm(request):
        if request.method == 'POST':
                form = HotelForm(request.POST, extra_a=request.POST.get('extra_adult'), extra_c=request.POST.get('extra_children'))
                if form.is_valid():
                        rooms = form.cleaned_data['rooms']
                        print "form is valid"
        else:
                form = HotelForm()

        return render(request, 'booking/booking.html', { 'form': form })

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的代码需要进行大量改进,我无法为您编写全部内容,但有些地方显然是错误的:

  1. 您的表单字段定义似乎很奇怪:rooms = forms.IntegerField(label=(min_value=1 ),请查看一些示例来修复它。

  2. 您的第一个错误是因为您没有在构造函数中定义rooms变量。此外,您不能像这样从字段rooms获取价值,所有表单字段都会同时填写和提交,这些字段无法相互交叉引用。您可能需要单独的表格来获取房间信息。

  3. 您尝试执行kwargs.pop(),但是您以错误的方式向表单提供额外数据。为了使其有效,您应该执行以下操作:

  4. form = HotelForm(request.POST, extra_adult=1, extra_children=2)

    您看到的示例有点误导,您不应该使用request.POST.get数据提供这些参数,应该提供其他一些来源,这就是为什么我建议您制作房间信息以不同的形式。一旦你有了,那么将结果提供给第二个表格要容易得多。