假设我们给出了以下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中。
请帮助我解决你的想法。
答案 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
)的值。