【问题标题】:How to calculate field not included in ModelForm after other fields are submitted提交其他字段后如何计算ModelForm中不包含的字段
【发布时间】:2014-10-12 22:17:25
【问题描述】:

假设我们得到了以下 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 然后 cgets 更新到 2 * a * ba * b 否则。

编辑:我想使用 AForm 作为 API,这样我的所有其他代码都可以通过表单与 A 实例一起使用。所以我想把所有的逻辑都封装在ModelForm里面。

请帮助我提出您的想法。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    你可以这样做:

    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)。这允许您在将模型保存到数据库之前使用表单中的数据初始化模型。然后您可以在保存模型之前设置或更改字段。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多