2009-06-06 107 views
5

我有這個模型時替換缺席的字段值:保存的ModelForm

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

當我在模板中使用這種形式,不會添加「公司」字段,這是預期的。但是該字段需要空白!=真。

我使用這種形式的方式,公司屬性將始終在視圖函數中知道,因爲它是從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 

回答

8

有兩種方法來解決這個問題:

實例化的初始值模型失蹤,但所需的字段:

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

有關更多詳細信息,請參見this section of the ModelForm API documentation中的說明。

順便提一句,editable=Falseexclude就足以從ModelForm中刪除一個字段;你不需要兩個。

1

@Ayman Hourieh的回答。只是爲了解決Django中的一個陷阱。如果你在表單中有多對多的字段。它不會保存在這裏。您應該明確地致電save_m2m()。如下添加一行。

form.save_m2m() 
相關問題