各フォームに一連の販売アイテムを指すドロップダウンがあるフォームセットを作成したいと思います。
モデル:
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)
クエリセットを設定する必要があります。トリッキーな状況...