开发者

is_valid always False (Django)

开发者 https://www.devze.com 2023-03-06 16:41 出处:网络
I have the following form with dynamic fields: 1) In models.py I want to pass in a value to the form to query

I have the following form with dynamic fields:

1) In models.py I want to pass in a value to the form to query

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) In 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))

In number 1 situation, I was able to display the dynamic fields in the for loop. However, the form threw me this error after filling up all of the fields and submitting(POST):

int() argument must be a string or a number, not 'QueryDict'. I was thinking it is the request.POST that is causing the error. after doing some research on this problem, there were similar solutions like this:

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) In models.py

class InsertValuesForm(forms.Form):
    def __init__(self, *args, **kwargs):

        idfield = kwargs.pop('idfield', False)

        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() )})

and

the following snippet of views.py(same as number 1)

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 rende开发者_JS百科r_to_response('fuzz/configuration.html', {
                'form': form,
            },context_instance=RequestContext(request))

Now the above code doesn't even display the dynamic textboxes and is just displayed as blank page. Appreciate if anybody can shed some light on

how to display these dynamic textboxes and at the same time, getting the values of these textboxes via request.POST and also making the form validate. Thanks


You have changed the signature of the form's __init__ so that the first positional parameter is idfield. Don't do that, because now when you instantiate it with form = InsertValuesForm(request.POST,idfield), it's taking the first parameter to be idfield, rather than request.POST.

Instead, define the method like this:

 def __init__(self, *args, **kwargs):
      idfield = kwargs.pop('idfield', None)
      ...etc...

and instantiate it with a keyword arg:

form = InsertValuesForm(request.POST, idfield=idfield)
0

精彩评论

暂无评论...
验证码 换一张
取 消