问题描述
|
我具有动态字段的以下形式:
1)在models.py中,我想将值传递给表单以进行查询
class InsertValuesForm(forms.Form):
def __init__(self,idfield,*args,**kwargs):
super(InsertValuesForm,self).__init__(*args,**kwargs)
for f in Parameter.objects.filter(id=idfield):
if Part.objects.get(parameter=f.parameter_name).isfunction:
self.fields.update({
f.parameter_name) : forms.CharField(widget=forms.Textinput() )})
1)在views.py中
def something(request)
#......
idfield = request.GET.get(\'feid\',\'0\')
form = InsertValuesForm(request.POST,idfield)
if request.method == \'POST\':
if form.is_valid():
#some code
else:
form = InsertValuesForm(idfield)
return render_to_response(\'fuzz/configuration.html\',{
\'form\': form,},context_instance=RequestContext(request))
在1号情况下,我能够在for循环中显示动态字段。但是,填写所有字段并提交(POST)后,该表单将我抛出此错误:
int()参数必须是字符串或数字,而不是\'QueryDict \'。我以为是导致错误的request.POST。
在对此问题进行了一些研究之后,有类似的解决方案:
http://groups.google.com/group/django-users/browse_thread/thread/ddefd76324ffe6cd
http://groups.google.com/group/django-users/browse_thread/thread/495a917396b20b37/c430d71a31204e5d#c430d71a31204e5d
2)在models.py中
class InsertValuesForm(forms.Form):
def __init__(self,**kwargs):
idfield = kwargs.pop(\'idfield\',False)
super(InsertValuesForm,**kwargs)
for f in Parameter.objects.filter(id=idfield):
if Part.objects.get(parameter=f.parameter_name).isfunction:
self.fields.update({
f.parameter_name) : forms.CharField(widget=forms.Textinput() )})
和
以下views.py片段(与数字1相同)
def something(request)
#......
idfield = request.GET.get(\'feid\',context_instance=RequestContext(request))
现在,上面的代码甚至不显示动态文本框,而仅显示为空白页。欣赏是否有人可以阐明
如何同时显示这些动态文本框,
通过request.POST获取这些文本框的值,并使表单生效。谢谢
解决方法
您已经更改了表单的ѭ4the的签名,因此第一个位置参数是
idfield
。不要这样做,因为现在用form = InsertValuesForm(request.POST,idfield)
实例化它时,它将第一个参数设为idfield
,而不是request.POST
。
相反,请定义如下方法:
def __init__(self,*args,**kwargs):
idfield = kwargs.pop(\'idfield\',None)
...etc...
并使用关键字arg实例化它:
form = InsertValuesForm(request.POST,idfield=idfield)