Django动态表单字段生成

Django dynamic form field generation

我想创建带有 'rooms' 字段的表单,它是整数字段。根据房间数量,我想为每个房间生成另外两个字段 'extra_adult' 和 'extra_children'。根据 children 的数量,我想生成 'children_age' 个字段。

我是 Python 和 Django 的新手,我尝试在 DYNAMIC FORM GENERATION post and like here 上做类似的事情,但我遇到了几个问题:

1) 我在 forms.py 中有一个错误 global name 'rooms' is not defined

2) 对于 extra_adultextra_childrenextra_children_age 字段,我应该如何 cleaned_data

3) 根据 children 的数量如何添加 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. 您的表单字段定义似乎很奇怪:rooms = forms.IntegerField(label=(min_value=1 ),请查看一些示例来修复它。

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

  3. 您尝试这样做 kwargs.pop(),但是您以错误的方式向表单提供了额外的数据。为了让它工作,你应该做这样的事情:

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

您看到的示例有点误导,您不应该为这些参数提供 request.POST.get 数据,它们应该与其他一些来源一起提供,这就是为什么我建议您在一种不同的形式。一旦你有了它,然后将结果提供给第二个表单就容易多了。