0

AngularJs と Django を使用したシングル ページ アプリケーションがあります。私のメイン ページでは、ページを読み込むときに必要なすべてのフォームを取得します。ただし、一部のフィールドは動的に更新されます。

私が持っているとしましょう

class Model1(models.Model):
    pass

class Model2(models.Model):
   model_1 = models.ForeignKey(Model1)

フォーム:

class Model2Form(forms.ModelForm):
    class Meta:
        model = Model2
        fields = ('model_1', )

私の SPA では、(ページをリロードせずに) Model1 のインスタンスを作成できます。表示されているオプションをフィルタリングし、選択フィールドに新しいインスタンスを動的に追加する方法を知っていますが、そうすることで、html が最初にレンダリングされたときに、角度の魔法が発生して利用可能なオプションをフィルタリングする前に、django によって作成されたクエリセットを取得します。デフォルトでは model.objects.all() です。わかりました、私はそれを表示したくありません。関数のinitに追加しようとしました:

self.fields['model_1'].queryset = Model1.objects.none()

実際、フォームが最初にレンダリングされたときに選択フィールドにオプションが表示されませんが、フォームを検証できず、エラーが発生します:(Select a valid choice. That choice is not one of the available choices.明らかに、 queryset. none() のために使用できるオプションがありませんでした)

呼び出されたときにフォームをロードするのではなく、ページが最初にロードされるときにフォームをロードしたいです。そうするのに役立つオプションはありますか?

乾杯ガイズ, キープ・ロッキング

4

2 に答える 2

1

model_1ここで指定されているように、のフィールドをModel2null にできること を指定する必要があります:外部キーの null をユーザーに許可します。ジャンゴ

model_1 = models.ForeignKey(Model1, null=True, blank=True, default = None)
于 2015-06-18T09:35:10.170 に答える
0

私はその問題を処理する方法を見つけます。それは非常にばかげています。問題のすべてのパラメーターを提供していません。

フォームはロード時にレンダリングされますが、検証すると CRUD 操作が行われ、この時点で送信するデータを処理するOTHERフォームが初期化されます。したがって、最初のレンダリングに使用しているフォームとデータを処理するフォームを区別するために、いくつかの追加の kwargs に基づいて、その (2 番目の) フォームの init でクエリセットをオーバーライドできます。

フィールドを null 可能にしたり、追加の検証を追加したりする必要はありません。

私が十分に明確であることを願っています。乾杯

于 2015-06-18T12:50:32.143 に答える