0

2 つのモデルを含むアプリがあります。最初はシナリオと呼ばれます。2 つ目はソリューションと呼ばれます。シナリオとソリューションの間には M2M があります。シナリオに属するソリューションはいくつでも持つことができ、その逆も可能です。かなり簡単です。

秘訣は、すべてがユーザーでフィルタリングされることです。ですから、私が働いているときに、他の人が持っている解決策やシナリオを見たくありません。

CreateView であるビューを作成しました。フィルタリングされたソリューションのリストをコンテキストに追加します。コンテキストに入ったら、テンプレートでループして ID を取得します。それをフォームに追加します。

私が抱えている問題は、form_valid メソッドにあります。

選択したアイテムをセーブに追加して、シナリオに追加するにはどうすればよいですか?

これが私の見解です:

class ScenarioCreate(CreateView):

    success_url = reverse_lazy('scenario_list')
    template_name = "gps/create_scenario_form.html"
    model = Scenario
    form_class = ScenarioCreateForm

    def get_context_data(self, **kwargs):
        context = super(ScenarioCreate, self).get_context_data(**kwargs)
        context['solution_list'] = Solution.objects.filter(user=self.request.user)
        return context

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.solutions = form.cleaned_data['solutions'] # <= what goes here?
        self.object.save()
        form.save_m2m()
        return HttpResponseRedirect(self.get_success_url())

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ScenarioCreate, self).dispatch(*args, **kwargs)

私は、cleaned_data がセットの問題を魔法のように解決すると思っていました。

2 つの質問があります。

  1. その保存を機能させるにはどうすればよいですか?
  2. コンテキストに正しく追加することを考えていますか、それとももっと良い方法がありますか?

すべての助けに感謝します。

更新: ScenarioCreateForm の追加

class ScenarioCreateForm(ModelForm):    
    class Meta:
        model = Scenario
        exclude = ('user', 'created')
4

0 に答える 0