2009-06-06 6 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

は、この問題を解決する方法は2つあります。

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=Falseまたはexcludeのいずれかのフィールドでは、ModelFormからフィールドを削除できます。あなたは両方を必要としません。 @Ayman Houriehの答えで

1

Djangoの落とし穴に対処するだけです。フォームに多対多フィールドがある場合。ここで救われることはありません。明示的にsave_m2m()を呼び出す必要があります。次のように1行追加してください。

form.save_m2m() 
関連する問題