1

各フォームに一連の販売アイテムを指すドロップダウンがあるフォームセットを作成したいと思います。

モデル:

class SalesItem(models.Model):        
    item_description    = models.CharField(max_length=40)
    company             = models.ForeignKey(Company)

ここでは、ドロップダウンのソースとして会社を渡すことを期待して、ドロップダウンのあるフォームを作成します。私のシナリオでは不可能だと思うので、この考えを持ち続けてください。

形:

class SalesItemFSForm(Form):        
    sales_item      =   forms.ModelChoiceField(required=False, queryset = '')

    def __init__(self, company, *args, **kwargs):
        super(SalesItemFSForm, self).__init__(*args, **kwargs)
        self.fields.sales_item.queryset = company.salesitem_set.all()

今、私の見解では、このフォームでフォームセットを作成したいと思います:

formset_type = formset_factory(SalesItemFSForm, extra=0)

ドロップダウンのソースを特定するために私が会社に入る方法はないように思われるため、問題はすぐに明らかになります。

どうすればいいですか?

どうもありがとう、

アップデート:

ジンゴがクラックしたようです。:)

ModelForm は Form よりも優れています。その上で、fields = {}SalesItemFSForm に追加して、SalesItem のフィールドがテンプレートに表示されないようにする必要がありました。関心があるのはドロップダウン (SalesItem) だけだからです。

ここまでは順調ですね。しかし今では、Salesitem と同じ数のドロップダウンが表示されています。ユーザーがjqueryボタンを押さない限り、何も表示されません。

そして、これが問題だと思います。パスするべきではありません

formset_type = modelformset_factory(SalesItem, form=SalesItemFSForm, extra=0)

このフォームは SalesItem のインスタンスを必要としないためです。ダミーモデルが必要です。

それが、最初に ModelFormset ではなく従来の Formset で解決しようとした理由です。ですから、そのような中途半端なものです。:)

更新 2:

ジンゴ、いいですね。事実上、私はカスタム保存を考えていました.jQueryを介してユーザーが追加したフォームセットの数を確認し、ビュー内に自分で保存します. 文字通り、SalesItem は ManyToMany フィールドです。しかし、標準の M2m ウィジェットはひどいものです。したがって、各 salesItem がドロップダウンであるフォームセットに置き換えたいと思いました。その後、ユーザーはページにドロップダウン (フォームセット内のフォーム) をいくつでも追加して送信できます。次に、関係をビューに追加します。

class DealType(models.Model):    
    deal_name           = models.CharField(_(u"Deal Name"), max_length=40)
    sales_item          = models.ManyToManyField(SalesItem)    
    price               = models.DecimalField(decimal_places=2, max_digits=12)

これが明確になることを願っています。たぶん、これを行う簡単な方法があります。:)

ところで、この優れたjqueryスニペットコードで、フォームセットに/からフォームを追加/削除する方法も見つけました。

更新 3:

実際、このようにオブジェクトをインスタンス化すると、フォームセットに 1 つのフォームしか取得できず、jquery を介してさらにフォームを追加できます。完全!!これを達成するためのより簡単な方法がない限り。:)

salesitem_formsets = formset_type(queryset=SalesItem.objects.filter(pk=1))

ただし、これはrequest.POSTであなたを狩って戻ってきます。

salesitem_formsets = formset_type(request.POST)

クエリセットを設定する必要があります。トリッキーな状況...

4

1 に答える 1

0

私はあなたが正しく達成したい目標を理解したことを願っています。次に、ModelFormとその使用可能なインスタンスを次のように使用できます。

class SalesItemFSForm(forms.ModelForm):
    class Meta:
        model = SalesItem

    def __init__(self, *args, **kwargs):
        super(SalesItemFSForm, self).__init__(*args, **kwargs)
        self.sale_items = self.instance.company.salesitem_set.all()
        self.fields['sales_item'] = forms.ModelChoiceField(queryset=self.sale_items)

これはテストされていませんが、単なる考えです。これが正しい方向につながることを願っていますが、それが完全に間違っている場合は、私に知らせてください。他の人が混乱しないように、私の答えを削除します:)。

于 2012-08-15T19:59:55.543 に答える