3

モデル A とモデル B と呼ぶモデルがいくつかあります。B から A への外部キーがあります。
つまり、A と B の間のカーディナリティは 1:n です。

MF_B という B に対応する ModelForm を作成しました。Bで定義する追加のフィールドがあります。例

class MF_B(forms.ModelForm):

    stuff = forms.MultipleChoiceField(queryset=None, required=False)

    class Meta:
        model=B

上記のコードが示すように、ここでは選択肢にクエリセットを入力します。(スタッフ フィールドにクエリセットを設定するために使用するinit ()のオーバーライド コードを省略しました)

取引は、inlineformset_factory を使用して、1 つのページに A のフォームと B の複数のフォームを作成したいということです。

たくさんの新しい kwargs を inlineformset_factory に渡したかったのですが、予期しないキーワード引数について不平を言い続けていました.djangoでバックエンド コードを見た後、理由がわかりました.inlineformset_factory はカスタム kwargs を取りません. メソッド sig で定義された kwargs のみを取ります。

def inlineformset_factory(parent_model, model, form=ModelForm,
                          formset=BaseInlineFormSet, fk_name=None,
                          fields=None, exclude=None,
                          extra=3, can_order=False, can_delete=True, max_num=None,
                          formfield_callback=None):

クエリセットに返されるオブジェクトをフィルター処理するには、self.request.user を渡す必要があるため、icanは formfield_callback を使用できないと思います。

助言がありますか?

4

1 に答える 1

0

MultipleChoiceFieldをクエリセットに制限するには、ファクトリを使用する必要があることを指定します。この場合、少し紛らわしいinlineformset_factory_factoryになりますが、たとえば次のようになります。

forms.py(または同様のもの)で

def make_inlineformset_factory(queryset, xmodel):
    """
    Returns an Inlineformset factory for the given queryset . . .
    """
    class My_inlineformset_factory():
        stuff = forms.ModelChoiceField(queryset=queryset)
        class Meta:
            model = xmodel
    return My_inlineformset_factory

具体的には、ここでの最初の答えと同様のアプローチを考えています。django:フォームセットでフィールドの選択を制限する方法は? ただし、Inlineformset_factoryに適切に適合させます。

後で時間を見つけることができるとき、私はより多くの詳細と説明を加えるために編集するかもしれません。

于 2012-05-15T17:56:42.460 に答える