is_valid始终为FalseDjango

问题描述

| 我具有动态字段的以下形式: 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)