7

我有一个这个模型:

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, )

然后是一个基于这个模型的表格:

class FleetForm(ModelForm):
    class Meta:
        model = Fleet
        exclude = ('company', )

当我在模板中使用此表单时,未添加“公司”字段,这是预期的。但该字段必须为空白!= True。

我使用这种形式的方式,company 属性在视图函数中总是已知的,因为它是从 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
4

2 回答 2

9

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

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

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

使用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()

有关更多详细信息,请参阅ModelForm API 文档的此部分中的注释

顺便说一句,要么 要么editable=False足以excludeModelForm;中删除一个字段。你不需要两者。

于 2009-06-06T11:52:23.387 回答
1

在@Ayman Hourieh 的回答中。只是为了解决 Django 中的一个陷阱。如果表单中有多对多字段。它不会在这里保存。您应该明确调用save_m2m(). 如下添加一行。

form.save_m2m()
于 2013-08-22T06:13:34.990 回答