How to modify the form filed data?

35 Views Asked by At

I have a model:

class PastStudy(Model):
    grade_average = FloatField(null=True)

I have a modelform as below:

class PastStudyForm(ModelForm):

    class Meta:
        model = PastStudy
        fields = ('grade_average', )

What I have in view:

...
if request.POST:
    past_study_form = PastStudyForm(request.POST)

    if past_study_form.is_valid():
        return HttpResponse(past_study_form.cleaned_data['grade_average'])

else:
    profile_filter_past_study_form = ProfileFilterPastStudyForm()
...

What I need is that I want to write a clean method for PastStudyForm so that in case I entered 90 as grade average, HttpResponse converts it two 0-20 grading scheme and returns 18. I tried this and I was still getting 90 not 18

class PastStudyForm(ModelForm):

    class Meta:
        model = PastStudy
        fields = ('grade_average', )

    def clean(self):
        cleaned_data = super().clean()
        grade_average = self.cleaned_data['grade_average']
        self.cleaned_data['grade_average'] = grade_average/5
        return cleaned_data

and This:

class PastStudyForm(ModelForm):

    class Meta:
        model = PastStudy
        fields = ('grade_average', )

    def clean_grade_average(self):
        grade_average = self.cleaned_data['grade_average']
        data = grade_average/5
        return data

However, I still get 90. I also have tried a few other methods but I still was getting 90 in HttpResponse

Maybe using clean method be wrong and I should do something else!

The real code is huge and I have summarized it in here and other aspects of the problem are not explained in here. That is why I prefer and expect to get a response in which I am advised how to it in the form definition, not other methods such as converting it in the view.

1

There are 1 best solutions below

2
lieahau On

in your clean method, you assign the result of your calculation method into self.cleaned_data,
while you are returning cleaned_data not self.cleaned_data.
it is different variable.

try this instead:

self.cleaned_data = super().clean()
grade_average = self.cleaned_data['grade_average']
self.cleaned_data['grade_average'] = grade_average/5
return self.cleaned_data