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