This postは非常に参考になります。しかし、私はクラスベースのビューを使って作業しており、クエリーセットが私が働いているモデルのインスタンスに依存している場合、ModelMultipleChoiceFieldに「選択された」アイテムを追加するタスクをどのように達成するのか疑問に思っています。フォームとModelMultipleChoiceFieldと既存データ
モデル:
AbstractConditionalOfferは、フィールドの名前 '、「offer_type」を提供class OfferGroup(models.Model):
name = models.CharField(max_length=64, null=False)
priority = models.IntegerField(null=False, unique=True)
class Meta:
verbose_name = _('OfferGroup')
ordering = ['priority', ]
class ConditionalOffer(AbstractConditionalOffer):
groups = models.ManyToManyField('auth.Group', verbose_name=_("User Groups"), blank=True)
offer_group = models.ForeignKey(OfferGroup, related_name='offers', null=True)
...
class Meta:
ordering = ['priority', ]
、他のモデルに日付時刻だけでなく、外部キーを起動して終了します。
フォーム:
はclass OfferGroupForm(forms.ModelForm):
offers = ModelMultipleChoiceField(queryset=ConditionalOffer.objects.all(),
widget=forms.widgets.SelectMultiple(), required=False)
class Meta:
model = OfferGroup
fields = ('name', 'priority', 'offers')
このフォームは本当に私が必要なものは、以下を参照してくださいされていない
ビュー:
class OfferGroupUpdateView(UpdateView):
model = OfferGroup
template_name = 'dashboard/offers/offergroup_edit.html'
form_class = OfferGroupForm
success_url = reverse_lazy('dashboard:offergroup-list')
def save_offers(self, offer_group, form):
selected_offers = form.cleaned_data['selected']
for offer in selected_offers:
offer_group.offers.add(offer, bulk=False)
other_offers = form.cleaned_data['not_selected']
for offer in other_offers & offer_group.offers.all():
offer_group.offers.remove(offer)
form.save()
return HttpResponseRedirect(reverse('dashboard:offergroup-list'))
def form_valid(self, form):
offer_group = form.save(commit=False)
return self.save_offers(offer_group, form)
さて、このアプローチの問題は、ということですOfferGroupFormに提供されたクエリーセットは、どのオファーが選択され、どのオファーがOfferGroupのインスタンスでないかに関する情報を提供しません私が編集したい帽子:ビューがレンダリングされるとき、現在のオファーグループへの外部キーを提供していますようにするため、私は必要なもの
が
og = OfferGroup.objects.get(pk=current offer_groups primary key)
selected = ConditionalOffers.objects.filter(offer_group=og)
other = ConditionalOffers.objects.exclude(offer_group=og)
ようものです(募集グループが編集されている)が表示されます選択した通り
また、モデルベースのフォームを使用してクラスベースビューでこれを行う方法はありますか?
私が提供したコードが少しばかり曖昧であれば、私を許してください - 私は最も顕著なスニペットを表示しようとしました。
ありがとうございます!
を:どのように私は、彼らは、フォームモデルのオブジェクトへの外部キーによって参照されているかどうかに基づいて選択した項目を複数選択ウィジェットを作成することができます。 すべてのConditionalOffersをMultiSelectに追加できます。選択したものの一部を設定するにはどうすればよいですか? – fiacre