我想创建一个包含' 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_adult
,extra_children
,extra_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 })
感谢您的帮助。
答案 0 :(得分:1)
您的代码需要进行大量改进,我无法为您编写全部内容,但有些地方显然是错误的:
您的表单字段定义似乎很奇怪:rooms = forms.IntegerField(label=(min_value=1 )
,请查看一些示例来修复它。
您的第一个错误是因为您没有在构造函数中定义rooms
变量。此外,您不能像这样从字段rooms
获取价值,所有表单字段都会同时填写和提交,这些字段无法相互交叉引用。您可能需要单独的表格来获取房间信息。
您尝试执行kwargs.pop()
,但是您以错误的方式向表单提供额外数据。为了使其有效,您应该执行以下操作:
form = HotelForm(request.POST, extra_adult=1, extra_children=2)
您看到的示例有点误导,您不应该使用request.POST.get
数据提供这些参数,应该提供其他一些来源,这就是为什么我建议您制作房间信息以不同的形式。一旦你有了,那么将结果提供给第二个表格要容易得多。