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。

このフォームの使用方法では、会社の属性は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

この問題を解決するには、次の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()

詳細については、ModelFormAPIドキュメントのこのセクションの注記を参照してください。

ちなみに、またはは;からフィールドを削除するのに十分editable=Falseです。両方は必要ありません。excludeModelForm

于 2009-06-06T11:52:23.387 に答える