0

I'm generating a form based on meta data in the following manner

class MeasureForm(forms.Form):
    def __init__(self,measure_id,*args,**kwrds):
        super(MeasureForm,self).__init__(*args,**kwrds)
        m = Measure.objects.get(pk=measure_id);
        if (m):
            self.fields["measure_id"] = forms.IntegerField(initial = m.id , widget=forms.HiddenInput())
            for mp in MeasureParameters.objects.filter(measure = m):
                # get the NVL'ed copy of the parameter
                p = mp.get_parameter_for_measure()
                if not p.is_modifiable:
                    # the file has a constant value
                    if (p.values and p.default): # contant must have both values and default index
                        value_ = p.values[p.values.keys()[p.default-1]];
                        self.fields[p.name] = forms.IntegerField(label = p.description , initial = value_);
                        self.fields[p.name].widget.attrs['readonly'] = True;
                    else:
                        raise Exception("Parameter set as unmodifiable but has no value. [measure: %s, parameter: %s, measureparameter %s]"
                                        % (measure_id , p.id , mp.__unicode__()))
                elif (p.values):
                    # convert hstore dict to list of tuples for the choices to read
                    values_ = [(v, k) for k, v in p.values.iteritems()];
                    # set default if exists , else take the first item
                    default_ = values_[p.default-1][0] if p.default else values_[0][0]
                    self.fields[p.name] = forms.ChoiceField(label = p.description , choices = values_ , initial = default_)
                else:
                    self.fields[p.name] = forms.IntegerField(label = p.description)
                if (not p.is_visible):
                    self.fields[p.name].widget = forms.HiddenInput()
        else:
            raise Exception ("Could not find measure. [measure %s]" % (measure_id));

This is my view

def index(request,measure_id = None):

    owners = Owner.objects.all()    
    form = None
    result = None
    title = None

    # handle the form
    if request.method == 'POST': # the form has been submitted
        form = MeasureForm(request.POST)
        if form.is_valid(): # All validation rules pass    
            result = 100; 
    else:
        if (measure_id):
            title = Measure.objects.get(pk=measure_id).name;
            # make an unbound form
            form = MeasureForm(measure_id) 

    return render(request, 'calc/index.html' ,
            {'owners' : owners, 
             'form'   : form , 
             'title'  : title , 
             'result' : result})

I followed this tutorial. I'm running into a problem when i issue submit back to the index view. i get the following error

int() argument must be a string or a number, not 'QueryDict'

I can see in the dump that it's fail in this line

m = Measure.objects.get(pk=measure_id); 

So I looked around and found this post . I tried to change the call to the form like this

form = MeasureForm(request.POST, measure_id = request.POST.get('measure_id'))

and i got the following error

__init__() got multiple values for keyword argument 'measure_id'

My first question is - Why is django executing the init again. a form object was already created - the fields just need to get bound form the post data.

Second , how can I overcome this ?

**django newbie. Thanks.

Community
  • 1
  • 1
haki
  • 9,389
  • 15
  • 62
  • 110

1 Answers1

0

Remove measure_id from init method and instead use kwrds['measure_id'] to retrieve it inside, then use them appropriately for keyword argument:

MeasureForm(request.POST, measure_id=measure_id)
MeasureForm(measure_id=measure_id)
mariodev
  • 13,928
  • 3
  • 49
  • 61
  • I'm getting a `KeyError` on `measure_id` for this line `measure_id = kwrds['measure_id']` at the first call from the index views `form = MeasureForm(measure_id)`. – haki Aug 30 '13 at 08:01
  • @haki use keyword argument like this `form = MeasureForm(measure_id=measure_id)` – mariodev Aug 30 '13 at 08:17
  • Thanks man. it's working now. First i got `__init__() got an unexpected keyword argument 'measure_id'` so i changed the init of super to take no arguments `super(MeasureForm,self).__init__()`. – haki Aug 30 '13 at 08:25