3

我正在从元数据生成一个表单

class MeasureForm(forms.Form):
    def __init__(self,*args,**kwargs):
        super(MeasureForm,self).__init__()
        measure_id = kwargs['measure_id']
        m = Measure.objects.get(pk=measure_id);
        if (m):
            # add the measure identifier as a hidden field
            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): # constant 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_, 
                            help_text = p.help_text)
                        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]"
                                        % (m.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_, 
                        help_text = p.help_text)
                else:
                    self.fields[p.name] = forms.IntegerField(label = p.description, help_text = p.help_text)
                if (not p.is_visible):
                    self.fields[p.name].widget = forms.HiddenInput()
        else:
            raise Exception ("Could not find measure. [measure %s]" % (m.id))

    def clean(self):
        return self.cleaned_data;

这是我的看法

def index(request,measure_id = None):

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

    # handle the form
    if request.method == 'POST': # the form has been submitted
        form = MeasureForm(request.POST, measure_id = request.POST.get('measure_id')) # A form bound to the POST data
        result = -100
        if form.is_valid(): # All validation rules pass
            result = 100
        msg = "%s" % repr(form.errors) # list of validation errors
    else:
        if (measure_id):
            title = Measure.objects.get(pk=measure_id).name;
            # make an unbound form
            form = MeasureForm(measure_id = measure_id)

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

这是我模板中的一个片段

<div class="content">
    {{ form.errors }}
    {{ form.non_field_errors }}
    {% if form %}
        <h2>{{ title }}</h2>
        <form action="/calc/{{m.id}}" method="post">{% csrf_token %}
            {{ form.as_p }}
        <input type="submit" value="Calculate" />
        </form>
    {% if result %}
        The Result is  <span class="result"> {{ result }} </span>
    {% endif %}
</div>

所以我得到空括号{},并且什么都不返回"%s" % repr(form.errors)。表单发布,我可以在请求中看到原始数据,但我不断从. 这是为什么 ?form.errorsform.non_field_errorsis_valid()

编辑:当检查表单是否绑定时,我也得到了错误。猜测这是问题所在。为什么在调用后表单没有绑定form = MeasureForm(request.POST, measure_id = request.POST.get('measure_id'))

** django 新手,谢谢。

4

1 回答 1

3

因为您没有将参数传递给超级调用。你应该做这个:

    super(MeasureForm,self).__init__(*args, **kwargs)

否则表单将永远不会用 POST 数据实际初始化。

评论后编辑该问题的答案不建议从超级调用中删除所有参数。如果您要通过,measure_id您只需事先将其从 kwargs 中删除:

def __init__(self, *args, **kwargs):
    measure_id = kwargs.pop('measure_id', None)
    super(MeasureForm,self).__init__(*args, **kwargs)
于 2013-08-30T09:09:45.107 回答