0

我有一个应用程序,其中有两个模型。第一个称为场景。第二个称为解决方案。场景和解决方案之间存在 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 会神奇地解决我设定的问题。

我有两个问题。

  1. 我如何让这个保存工作?
  2. 我是否正在考虑正确地添加到上下文中,还是有更好的方法?

所有帮助表示赞赏。

更新:添加 ScenarioCreateForm

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

0 回答 0