2017-05-10 11 views
0

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) 

ようものです(募集グループが編集されている)が表示されます選択した通り

また、モデルベースのフォームを使用してクラスベースビューでこれを行う方法はありますか?

私が提供したコードが少しばかり曖昧であれば、私を許してください - 私は最も顕著なスニペットを表示しようとしました。

ありがとうございます!

+0

を:どのように私は、彼らは、フォームモデルのオブジェクトへの外部キーによって参照されているかどうかに基づいて選択した項目を複数選択ウィジェットを作成することができます。 すべてのConditionalOffersをMultiSelectに追加できます。選択したものの一部を設定するにはどうすればよいですか? – fiacre

答えて

0

ソリューションは、ビュー内のget_context_dataメソッドオーバーライドすることである。簡単にするため

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    # get the current obj 
    obj = context.get('offergroup') 
    # use the current object to get related objects 
    qs = ConditionalOffer.objects.filter(offer_group=obj) 
    # add context variables that can be used in the template 
    context['selected'] = qs.values_list('name', flat=True) 
    context['offers'] = ConditionalOffer.objects.all().exclude(offer_group=obj) 
    return context 
関連する問題