保存模型时替换缺少的字段值

pri*_*stc 7 django django-forms

我有这个型号:

class Fleet(models.Model):
    company     =   models.ForeignKey("Company", editable=False)
    aircraft    =   models.ForeignKey("Aircraft")
    size        =   models.IntegerField(default=1)
    description =   models.TextField(blank=True)

    def __unicode__(self):
        return u"%s" % (self.aircraft, )
Run Code Online (Sandbox Code Playgroud)

然后是基于此模型的表单:

class FleetForm(ModelForm):
    class Meta:
        model = Fleet
        exclude = ('company', )
Run Code Online (Sandbox Code Playgroud)

当我在模板中使用此表单时,不会添加"公司"字段,这是预期的.但该字段必须为空白!=真.

我使用这种形式的方式,公司属性将始终在视图函数中已知,因为它是从URL传递的.在保存之前,如何将公司添加到视图功能中的表单中?

这是我的观点:

def new_fleet(request, company_id):
    from forms import FleetForm

    company = Company.objects.get(pk=company_id)

    if request.method == "POST":
        form = FleetForm(request.POST,)

        form.company = company            #doesn't work

        form = form.save(commit=False)    #can't do this because the form 
        form.company = company            #doesn't validate (company is not set)

        if not form.errors:
            form.save()

    else:
        fleet = Fleet(company=company)    #pointless because the company widget
        form = FleetForm(instance=fleet)  #isn't created but eh whatever
Run Code Online (Sandbox Code Playgroud)

Aym*_*ieh 9

有两种方法可以解决此问题:

使用缺少但必需的字段的初始值实例化您的模型:

company = Company.objects.get(pk=company_id)
fleet = Fleet(company=company)
form = FleetForm(request.POST, instance=fleet)
new_fleet = form.save()
Run Code Online (Sandbox Code Playgroud)

使用save(commit=False)并手动设置任何额外的必填字段:

company = Company.objects.get(pk=company_id)
form = FleetForm(request.POST)
fleet = form.save(commit=False)
fleet.company = company
new_fleet = fleet.save()
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅ModelForm API文档的本节中的注释.

顺便说一下,要么从一个领域移除一个editable=Falseexclude足够的ModelForm; 你不需要两者.