如何在提交其他字段后计算未包含在ModelForm中的字段

时间:2014-08-19 17:45:42

标签: django django-forms

假设我们给出了以下Model和ModelForm:

from django.db import models
from django import forms

class A(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.IntegerField()  # either c = a * b or c = 2 * a * b

class AForm(forms.ModelForm)
    class Meta:
        model = A
        fields = ('a', 'b')
    double = forms.BooleanField(required=False)

现在我希望如果用户检查double,那么c会更新为2 * a * b,而a * b会更新。{/ p>

编辑:我想使用AForm作为API,以便我的所有其他代码通过表单与A实例一起使用。因此,我想将所有逻辑封装在ModelForm中。

请帮助我解决你的想法。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

def some_view(request):
    if request.method == "POST":
        form = AForm(request.POST)  # Initialize form with POST data
        if form.is_valid():
            model = form.save(commit=False)  # Initialize model with form data, but do not save to db
            model.c = model.a * model.b
            if form.cleaned_data['double']:  # If double field was set true
                model.c = 2 * model.c
            model.save()

    return HttpResponseRedirect(reverse('some-url'))

请注意,此处的关键代码是form.save(commit=False)。这允许您在将表单中的数据保存到数据库之前使用表单中的数据初始化模型。然后,您可以在保存模型之前设置或更改字段。

另请注意,您可以通过表单double词典访问各个表单字段(例如cleaned_data)的值。