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_errors返しません。フォームが投稿され、リクエストで生データを見ることができますが、から false を取得し続けますis_valid()。何故ですか ?

編集:フォームがバインドされているかどうかを確認すると、falseも取得されます。これが問題だと推測。の呼び出し後にフォームがバインドされないのはなぜform = MeasureForm(request.POST, measure_id = request.POST.get('measure_id'))ですか?

** ジャンゴ初心者、ありがとう。

4

1 に答える 1